Java 您希望何时使用两个缓存线程池?

Java 您希望何时使用两个缓存线程池?,java,multithreading,threadpool,Java,Multithreading,Threadpool,考虑一下这个来自Netty教程的例子(尽管这不是我见过的唯一一个例子): 这里创建了两个单独的缓存线程池。但是为什么呢?如果多个线程池的大小固定,我可以理解它们的用途,但缓存的线程池不是。那么,如果可以有一个不断扩展的线程池,为什么还要有多个缓存线程池呢?事实上,只有一个不是更好吗?因为如果您有两个不同的线程提交任务,那么这意味着更可能利用空闲的工作线程 我想知道这一点,因为我正在为服务器编写网络,并且我分别处理UDP和TCP连接。我想将处理任务分派到线程池,我正在考虑为此使用缓存线程池。然而,

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

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

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


谢谢。

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

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

您可以使用不同名称的线程工厂进行监视


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

但是如果池被缓存,为什么池是分开的呢?为什么不只是一个呢?@MartinTuskevicius我认为这与响应时间和池的不同用途有关。这是一个很好的观点,我没有考虑任务的生命周期。
Executor bossPool = Executors.newCachedThreadPool();
Executor workerPool = Executors.newCachedThreadPool();
ChannelFactory channelFactory = new NioClientSocketChannelFactory(bossPool, workerPool);