当前位置: 首页 > 知识库问答 >
问题:

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

曹涵润
2023-03-14

我有线程池执行器,其下一个参数为:

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

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

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

JAVAutil。同时发生的ThreadPoolExecutor@3e6be2d8[正在运行,池大小=100,活动线程=2,排队任务=10,已完成任务=4471827]。

我在文档中发现,getActiveCountmethod返回正在积极执行任务的线程的大致数量 但这无助于我理解。。。

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

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


共有1个答案

秦弘亮
2023-03-14

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

当线程启动或变得空闲时,它们不会“立即”拿起任务——从队列中读取会有竞争。如果您在一个紧密的循环中向执行程序提交100个任务,到最后很可能只有几个工作线程有机会拿起一个任务。

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

 类似资料:
  • 问题内容: 我想知道什么是Java线程转储。有人可以帮我了解什么是线程转储以及它与正在运行的Java程序的关系吗? 问题答案: Java线程转储是一种找出JVM中每个线程在特定时间点正在做什么的方法。如果您的Java应用程序有时在负载下运行时挂起,这将特别有用,因为对转储的分析将显示线程卡在哪里。 您可以通过运行并通过单击生成线程转储。 要了解如何从JVM进行线程转储,请参见此处 要了解如何创建线

  • 问题内容: 在Java并发中,什么使线程“ 活动 ”?只是它没有空转的事实?从技术上讲,是否还在考虑“等待”或“暂停”线程? 问题答案: 据我所知,“主动”一词似乎使用了很多,但从未定义过。该方法记录为: 将此线程组及其子组中的每个活动线程复制到指定的数组中。 和从在寻找源出于此,它被检查方法以及将这些的枚举。据此,我推断出“活动”和“活跃”这两个术语是可以互换的,并且“活跃”被定义为: 如果线程

  • 问题内容: 我看过的利弊一些文章,并在Java编程语言。在其中一篇文章中,作者提到: StringBuilder 不是 线程安全的 ,因此在 多个线程中 使用 StringBuffer 。 不幸的是,我不明白这意味着什么。你能解释一下之间的区别,以及特别是在“线程安全”的环境。 如果您可以使用代码示例进行描述,我将不胜感激。 问题答案: 如果多个线程正在修改a的相同实例,则结果可能是意外的- 即某

  • 以下是Sun创建线程的简单规则: 如果线程数小于corePoolSize,请创建新线程以运行新任务 为什么在队列已满时创建非核心线程?我不明白他们为什么这样做。为什么不在队列为空时创建非核心线程?

  • 问题内容: 在有效的Java书中,它指出: 语言规范保证,除非变量的类型或类型为[JLS,17.4.7],否则读写变量是原子的。 在Java编程或一般编程中,“原子”是什么意思? 问题答案: 这是一个示例,因为一个示例通常比冗长的解释更清晰。假设是类型为的变量。以下操作不是原子操作: 实际上,变量是使用两个单独的操作写入的:一个操作写入前32位,第二个操作写入后32位。这意味着另一个线程可能读取的

  • 在这段代码中,两个连接和断开是什么意思?导致停止,直到终止?