newCachedThreadPool如何重用线程?

zel*_*ler 5 java multithreading executorservice

javadoc说通过Executors.newCachedThreadPool重用线程返回的服务.这怎么可能?一个线程只能通过调用启动一次start.那么他们如何实现呢?这个服务的线程是在一个无限循环中运行,它们的Runnable-s是按需替换的?

Pet*_*rey 4

一个 Runnable 可以调用另一个 Runnable。

每个线程仅运行一个主 Runnable,但该 Runnable 从共享的 BlockingQueue 中获取 Runnable 并调用这些 Runnable,直到其关闭。

简化了确实如此。

final BlockingQueue<Runnable> queue = ...

Runnable runs = new Runnable() { public void run() {
    while(running)
        queue.take().run();
}};
Run Code Online (Sandbox Code Playgroud)

您可以阅读代码以了解其实际操作方式。