【问题标题】:Java CachedThreadPool vs FixedThreadPoolJava CachedThreadPool 与 FixedThreadPool
【发布时间】:2015-12-23 20:21:48
【问题描述】:

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

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

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

建议每种方法的优缺点。

【问题讨论】:

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

标签: java multithreading executorservice threadpoolexecutor


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多