java - ThreadPoolExecutor中的 "active threads"是什么意思?

标签 java multithreading concurrency threadpool threadpoolexecutor

我有 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/

相关文章:

使用 iText 格式化 pdf 中的 JavaFx html 格式文本

java - 为什么没有显示正确的布局?

java - 是否有用于 buildScript 依赖项的 Gradle "dependencies "任务?

concurrency - 如何在 Rust 中的多个线程之间共享结构的不可变引用?

multithreading - 如何将纤维传递给线程?

java - 并发访问时 Treemap 中的重复键

java - 组合发电机

c# - 从一个 C# 应用程序创建到同一 MYSQL 数据库的多个连接

python - 我正在尝试在 python 中运行一个线程,但没有看到输出

c++ - 使用 C++11 异步功能的管道数据流