Java CachedThreadPool与FixedThreadPool

Java CachedThreadPool与FixedThreadPool,java,multithreading,executorservice,threadpoolexecutor,Java,Multithreading,Executorservice,Threadpoolexecutor,我在应用程序上运行了负载测试,以找到支持计划负载所需的最大线程数 我使用了ExecutorServiceCachedThreadPool,以便根据负载动态创建线程。现在我使用getLargestPoolSize()知道了最大线程数的值 我是否应该将CachedThreadPool替换为FixedThreadPool(maxValue),以避免CachedThreadPool的大(Integer.MAX_值)线程创建行为 建议它们各自的优缺点。在Java中,缓存线程池和固定线程池之间最重要的区别在

我在应用程序上运行了负载测试,以找到支持计划负载所需的最大线程数

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

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


建议它们各自的优缺点。

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

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


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

您指的是什么“大线程创建行为”?您的意思是,如果没有可用线程,缓存的线程池将创建一个新线程吗?如果是这样的话,更好的问题是“如果我在所有工作线程都不可用的情况下提交另一个任务,我会介意我的线程被阻塞吗?”请记住,缓存的线程池会在一定时间后销毁线程。虽然你知道最大计数,但平均计数是多少?如果最大计数为10,但平均数为4,则保持10个线程处于活动状态没有多大意义。大型线程创建行为-如果有人发送太多请求,cachedThreadPool不应创建Integer.MAX_值线程找到更多好的答案@