具有单个线程池比多个线程池更好的设计


问题内容

在Java中拥有多个线程池的优缺点是什么?我已经看过代码,其中有多个线程池用于不同的“类型”任务,而且我不确定它是更好的设计还是只是开发人员感到懒惰。一个示例是将ScheduledThreadPoolExecutor用于定期执行的任务或具有超时的任务,而将另一ThreadPoolExecutor用于其他任务。


问题答案:

具有单独的专用线程池的目的是,使活动不会因线程不足而被饥饿,因为其他活动占用了所有线程。如果某些服务具有自己的线程池,则可以确保可以使用一定数量的线程,并且对其他服务的需求不那么敏感。

使用多个专用线程池,如果服务需要太多线程,则它必须等待线程可用,从而将背压引入系统,从而使其逐渐降级,并且由于其他部分拥有自己的线程池,因此它们有机会赶上他们的部分。因此,想法是随着负载的变化,系统应具有更稳定的特性。在您描述为计划的任务使用单独的线程池的情况下,请确保无论系统其余部分有多忙,这些任务都可以运行。

多个线程池将需要进行调整,以确保每个池都有足够的线程而不是太多。使用单个线程池,您不需要调整,有时可能会更好地利用所有线程,但是您可能无法预测某些重要任务会及时获取需要完成的线程。