ThreadPoolExecutor 中的“活动线程”是啥意思?

Posted

技术标签:

【中文标题】ThreadPoolExecutor 中的“活动线程”是啥意思?【英文标题】:What does "active threads" mean in ThreadPoolExecutor?ThreadPoolExecutor 中的“活动线程”是什么意思? 【发布时间】:2020-11-25 02:11:33 【问题描述】:

我有下一个参数的 ThreadPoolExecutor:

corePoolSize = 20
maximumPoolSize = 100
workQueue = new LinkedBlockingQueue(10)

我每秒提交 1k 个任务。任务代表一些需要 1-2 秒的 IO 操作。他们中的一些人被拒绝了。这是预期的。 我使用自定义 AbortPolicy 在拒绝之前记录线程池状态。

在日志中我看到了一些我无法解释的东西。像这样的消息:

java.util.concurrent.ThreadPoolExecutor@3e6be2d8[正在运行,池大小 = 100,活动线程 = 2,排队任务 = 10,已完成任务 = 4471827]。

我在文档中发现 getActiveCount 方法 Returns the approximate number of threads that are actively executing tasks. 但这并不能帮助我理解......

这里的“活动线程”是什么意思?为什么只有 2 个线程处于活动状态,而池已达到其限制,队列已满而任务被拒绝?

我想增加maximumPoolSize一次处理更多的任务,但首先我需要了解我是否有效地使用了线程池资源。

【问题讨论】:

【参考方案1】:

“活动线程”是指已开始执行工作队列中的任务的线程。

当线程启动或空闲时,它们不会“立即”接收任务 - 存在从队列中读取的争用。如果你在一个紧密的循环中向执行器提交 100 个任务,很可能到最后只有少数工作线程有机会接受一个任务。

要更好地了解实际运行任务的线程数,请定期记录活动线程数,例如每秒 10 次。

【讨论】:

很好的答案,除了最后一部分。为什么说“至少需要 1-2k 个线程”? @BasilBourque 我假设 OP 希望为他们每秒提交的 1000 个任务提供服务。我会澄清 任务由几个线程提供服务。您不需要拥有与任务一样多的线程。这正是 Executors 框架的目的。您的答案的第一部分会建议您理解这一点。所以我一定是误解了你答案的第二部分。 @MikeYakovets 这也是我所期望的,除了“活动线程”被记录为 100 或接近 100\。这不是你看到的吗?被 IO 阻塞的线程会被计为活跃的,是的。 通过在任务被拒绝时记录活动线程计数,您可能会在许多线程开始运行任务之前记录许多消息。如果您想更好地了解实际运行任务的线程数,请定期记录活动线程数,例如每秒 10 次。

以上是关于ThreadPoolExecutor 中的“活动线程”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Java:ThreadPoolExecutor中的Worker

Java:ThreadPoolExecutor中的Worker

java进阶之路-java中的ThreadPoolExecutor

ThreadPoolExecutor 中的工作人员并不是真正的守护进程

Java: 线程池(ThreadPoolExecutor)中的参数说明

ThreadPoolExecutor扩展