您何时想使用两个缓存的线程池?

时间:2013-04-18 13:32:32

标签: java multithreading threadpool

从Netty教程中考虑这个例子(虽然它不是我见过的唯一例子):

Executor bossPool = Executors.newCachedThreadPool();
Executor workerPool = Executors.newCachedThreadPool();
ChannelFactory channelFactory = new NioClientSocketChannelFactory(bossPool, workerPool);

此处创建了两个单独的缓存线程池。但为什么?我可以理解多线程池的目的,如果它们具有固定大小,但缓存线程池不是。那么,如果你可以拥有一个不断扩展的线程池,你为什么要拥有多个缓存的线程池呢?事实上,只拥有一个不是更好吗?因为如果你有两个不同的线程提交任务,那么这意味着更有可能使用空闲的工作线程。

我对此感到疑惑,因为我正在为服务器编写网络,而我正在分别处理UDP和TCP连接。我想将处理任务分派给线程池,我正在考虑使用缓存线程池。但是,我不知道是否应该使用一两个。

感谢。

3 个答案:

答案 0 :(得分:2)

我能想到拥有2个缓存线程池的唯一原因是你需要以不同的方式对池进行操作。例如,您可能有两类任务,并且您希望在其中一个处理一类任务但不处理另一类任务的线程池上执行awaitTermination()。或者您可能希望shutdownNow()其中一个池而不影响您将允许流失的其他池。或者你可能为每个池都有一个不同的线程工厂 - 尽管在你的代码示例中并不明显。

答案 1 :(得分:1)

您可以使用不同的NamedThreadFactory进行监控。

缓存线程池中的空闲线程也会在60秒后被杀死,因此它们可能具有不同的生命周期。在内部,它使用自己的BlockingQueue ReentrantLock和其他同步来管理池中的线程。创建新线程池可以减少争用。线程池也可能有不同的生命周期。

答案 2 :(得分:0)

一个池最可能用于获取初始请求,另一个池用于处理它