【问题标题】:Very few threads in the thread pool of threadpoolexcecutor actively executing tasksthreadpoolexcecutor 的线程池中很少有线程主动执行任务
【发布时间】:2011-04-24 00:18:20
【问题描述】:

我正在使用ThreadPoolExecutorcorePoolSize = maxPoolSize = queueSize = 15

每个传入的请求都会产生 7 个任务,用这个线程池执行。

即使每个单独的任务在被安排后用时不到 3 秒,但整个请求所需的时间要长得多。

我怀疑系统缺少正在排队的线程和任务。

我为每个传入请求记录了以下信息。

getActiveCount()
getLargestPoolSize()
getPoolSize()
getQueue().size()

我注意到系统并没有缺少线程。

getPoolSizegetLargestPoolSize 的值始终为 15 - 这是预期的结果。

getQueue().size() 始终为 0 - 因此没有任务排队。

getActiveCount() 值始终介于 1-2 之间。

为什么池中的其余线程不工作?

是“getActiveCount()-返回正在主动执行任务的线程的大概数量。”使用正确的 API 吗?

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    正如@Thomas 建议的那样,池正在根据需要创建线程,因此如果您一次只给池 1-2 个任务,它只会有 1-2 个线程处于活动状态。如果你想让它更忙,你需要一次给它提供更多的任务。

    【讨论】:

    • 每个传入的请求,都会在一个紧密的循环中添加 7 个任务。
    • 除非你的任务很重要,否则它可能不会创建新线程。如果在这个紧密循环之后立即 getActive(),你会看到什么。
    【解决方案2】:

    我不太了解 Java 的线程池,但通常您只会创建与您的机器有可用内核(或硬件线程)一样多的线程。如果您在双核机器上运行,则 2 个活动线程是一个合理的值。

    【讨论】:

    • 这根本不是真的。例如,如果您使用的是慢速外部服务,例如休息 API,那么您可以轻松支持比可用内核数量多得多的线程。
    • 是的,我的 7 个任务实际上是 7 个外部服务调用。所以我猜当线程在 I/O 上被阻塞时(在我的例子中是网络),它应该处理更多的线程。但似乎不是。
    【解决方案3】:

    您是否尝试过在 Eclipse 中以调试模式运行它?它通常显示所有分配的线程及其状态。 我怀疑在您的情况下会发生以下情况:您有线程池并且线程池已分配线程数来处理您提交到其中的任务。但是一旦线程池中的任何特定线程完成了提交到线程池的任务,它就不会终止。相反,它将其状态切换为 BLOCKED 或 WAITING (我不记得它们中的哪一个)并等待下一个任务传递到这个特定线程进行处理。

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 2011-08-05
      • 2015-06-26
      • 2019-10-08
      • 2011-11-03
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 2013-08-06
      相关资源
      最近更新 更多