newCachedThreadPool如何重用线程?

时间:2012-08-22 11:23:22

标签: java multithreading executorservice

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

1 个答案:

答案 0 :(得分:4)

Runnable可以调用另一个Runnable。

每个线程只运行一个主Runnable,但Runnable从共享的BlockingQueue中获取Runnables并调用它们直到它被关闭。

简化它。

final BlockingQueue<Runnable> queue = ...

Runnable runs = new Runnable() { public void run() {
    while(running)
        queue.take().run();
}};

您可以阅读代码以了解它是如何实现的。