何时需要使用两个缓存线程池?

5
考虑一下来自Netty教程的这个例子(尽管我看到的不止一个这样的例子):
Executor bossPool = Executors.newCachedThreadPool();
Executor workerPool = Executors.newCachedThreadPool();
ChannelFactory channelFactory = new NioClientSocketChannelFactory(bossPool, workerPool);

这里创建了两个独立的缓存线程池。但是为什么呢?如果它们是固定大小的,我可以理解使用多个线程池的目的,但缓存线程池不是。那么,如果可以不断扩展一个线程池,为什么还需要多个缓存线程池呢?实际上,只有一个线程池会更好吧?因为如果有两个不同的线程提交任务,那么空闲工作线程被利用的可能性更大。
我对此感到好奇,因为我正在为服务器编写网络部分,并且单独处理UDP和TCP连接。我想将处理任务分派给线程池,并考虑使用缓存线程池。但是,我不知道是否应该使用一个还是两个。
谢谢。
3个回答

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

这是一个很好的观点,我没有考虑到任务的生命周期。 - Martin Tuskevicius

1
你可以使用不同的NamedThreadFactory进行监控。
此外,缓存线程池中的空闲线程在60秒后会被终止,因此它们可能具有不同的生命周期。它在内部使用自己的BlockingQueue ReentrantLock和其他同步机制来管理线程池中的线程。创建新的线程池可能会减少争用。另外,线程池可能具有不同的生命周期。

0

一个池子很可能是用来接收初始请求的,另一个池子则是用来处理它的。


但是如果它们被缓存了,为什么要将池分开呢?为什么不只有一个池呢? - Martin Tuskevicius
@MartinTuskevicius 我认为这与响应时间和池的不同目的有关。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接