Java CachedThreadPool 与 FixedThreadPool

Java CachedThreadPool vs FixedThreadPool

我 运行 对我的应用程序进行负载测试,以找出支持计划负载所需的最大线程数。

我已经使用 ExecutorService CachedThreadPool 以便根据负载动态创建线程。现在我知道使用 getLargestPoolSize() 的最大线程数的值。

我是否应该将 CachedThreadPool 替换为 FixedThreadPool(maxValue),以避免 CachedThreadPool 的大型 (Integer.MAX_VALUE) 线程创建行为?

提出各自的优缺点。

Java 中缓存线程池和固定线程池之间最重要的区别是缓存线程池对其生成和使用的线程数没有上限。首选哪一个取决于您希望缩放行为是什么样的。

缓存线程池的主要优点是即使您有大量未预料到的任务要执行,线程也会立即开始执行。例如,您的业务需求可能会在数月或数年内增加,您的应用程序可能会转移到更强大的机器上,使用缓存线程池将允许通过使用增加的可用处理能力来满足增加的需求,而无需更改代码.这可能是一个优势,因为一旦应用程序投入使用数月或数年,人们可能不太容易记住代码以将线程限制识别为可以更改以提高性能的参数。

固定线程池的主要优点是对线程数量的控制更加严格。如果此应用程序在短时间内接收大量任务,这有​​助于防止软件安装的其他部分(在应用程序内或其他应用程序中)处理能力不足。此外,降低了 运行 进入操作系统线程限制的风险,从而降低了当进程需要生成线程但无法生成线程时可能导致的软件崩溃的风险。