5

考虑一下 Netty 教程中的这个例子(尽管它不是我见过的唯一例子):

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

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

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

谢谢。

4

3 回答 3

2

我能想到拥有 2 个缓存线程池的唯一原因是,如果您需要对池进行不同的操作。例如,您可能有两类任务,并且您想awaitTermination()在处理一类任务但不处理另一类任务的线程池中执行。或者,也许您想shutdownNow()在不影响您允许排水的另一个池的情况下使用其中一个池。或者,也许您对每个池都有不同的线程工厂——尽管在您的代码示例中并不明显。

于 2013-04-18T13:38:15.187 回答
1

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

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

于 2013-04-18T13:42:58.797 回答
0

一个池很可能用于接收初始请求,另一个用于处理它

于 2013-04-18T13:35:50.397 回答