我有 ThreadPoolExecutor 和下一个参数:
corePoolSize = 20
maximumPoolSize = 100
workQueue = new LinkedBlockingQueue(10)
我每秒提交 1k 个任务。任务代表一些需要 1-2 秒的 IO 操作。他们中的一些人被拒绝了。这是预期的。 我使用自定义 AbortPolicy 在拒绝之前记录线程池状态。
在日志中我看到了一些我无法解释的东西。消息如:
java.util.concurrent.ThreadPoolExecutor@3e6be2d8[Running, pool size = 100, active threads = 2, queued tasks = 10, completed tasks = 4471827].
我在文档中发现 getActiveCount
方法 返回正在执行任务的线程的大概数量。
但这并不能帮助我理解...
这里的“Activity 线程”是什么意思?为什么只有 2 个线程处于 Activity 状态,而池已达到其限制、队列已满且任务被拒绝?
我想增加 maximumPoolSize
以一次处理更多任务,但首先我需要了解我是否有效地使用 ThreadPool 资源。
最佳答案
“Activity 线程”是指已开始执行工作队列中任务的线程。
当线程启动或变得空闲时,它们不会“立即”选择任务 - 存在从队列中读取的争用。如果您在一个紧密的循环中向执行程序提交 100 个任务,很可能到最后只有少数工作线程有机会接受任务。
要更好地了解实际有多少线程正在运行任务,请定期记录 Activity 线程数,例如每秒 10 次。
关于java - ThreadPoolExecutor中的 "active threads"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63256056/