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