考虑一下Netty教程中的以下示例(尽管这不是我见过的唯一示例):
Executor bossPool = Executors.newCachedThreadPool();
Executor workerPool = Executors.newCachedThreadPool();
ChannelFactory channelFactory = new NioClientSocketChannelFactory(bossPool, workerPool);
在这里创建两个单独的缓存线程池。但为什么?如果多个线程池的大小固定,我可以理解它们的用途,但是高速缓存的线程池不是固定大小的。那么,如果只拥有一个不断扩展的缓存池,为什么还要拥有多个缓存的线程池呢?实际上,只有一个不是更好吗?因为如果您有两个不同的线程提交任务,那么这意味着更可能利用空闲的工作线程。
我对此很疑惑,因为我正在为服务器编写网络,并且正在分别处理UDP和TCP连接。我想将处理任务分派(dispatch)到线程池,并且我正在考虑为此使用缓存的线程池。但是,我不知道应该使用一两个。
谢谢。
最佳答案
我可以想到拥有2个缓存线程池的唯一原因是,如果您需要对池进行不同的操作。例如,您可能有两类任务,并且您想在处理一类任务而另一类却没有的线程池中执行awaitTermination()
。或者,也许您想对其中一个池进行shutdownNow()
而不影响允许您耗尽的另一个池。或者,也许每个池都有一个不同的线程工厂-尽管在代码示例中并不明显。