我在应用程序上进行了负载测试,以查找支持计划的负载所需的最大线程数。
我使用了ExecutorService
CachedThreadPool
,以便根据负载动态创建线程。现在我知道了使用getLargestPoolSize()
的最大线程数的值。
是否应将CachedThreadPool
替换为FixedThreadPool(maxValue)
,以避免(Integer.MAX_VALUE)
产生大量CachedThreadPool
线程的行为?
建议它们各自的优缺点。
最佳答案
Java中的缓存线程池和固定线程池之间最重要的区别是,缓存线程池对将产生和使用的线程数没有上限。首选哪一种取决于您希望缩放行为如何。
缓存的线程池的主要优点是,即使您有意想不到的大量任务要执行,线程也将立即开始执行。例如,您的业务需求可能会持续数月或数年,并且您的应用程序可能会转移到功能更强大的计算机上,并且使用缓存的线程池将允许通过使用增加的可用处理能力来满足增加的需求,而不必更改代码。这是一个优势,因为一旦应用程序投入使用数月或数年,人们可能就不太容易记住代码,无法将线程限制识别为可以更改以提高性能的参数。
固定线程池的主要优点是线程数量受到更严格的控制。如果该应用程序在短时间内收到大量任务,这有助于防止软件安装的其他部分(在应用程序内部或在其他应用程序中)的处理能力不足。此外,降低了陷入操作系统线程限制的风险,从而降低了当进程需要生成线程而无法生成线程时可能导致的软件崩溃风险。