【问题标题】:When would you want to use two cached thread pools?您什么时候想使用两个缓存线程池?
【发布时间】:2013-04-18 13:32:31
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: java multithreading threadpool


    【解决方案1】:

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

    【讨论】:

    • 这很好,我没有考虑任务的生命周期。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 但是,如果它们被缓存了,为什么还要将它们分开呢?为什么不只有一个?
      • @MartinTuskevicius 我认为这与响应时间和池的不同用途有关。
      猜你喜欢
      • 1970-01-01
      • 2014-05-03
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2018-11-06
      • 2013-04-22
      • 1970-01-01
      相关资源
      最近更新 更多