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 中的工作人员并不是真正的守护进程