8

Java SE 6 文档中的 ThreadPoolExecutor 类具有以下方法

public int getActiveCount()

返回正在主动执行任务的线程的大致数量。

这里的近似主动执行是什么意思?

是否有任何保证,如果在调用之前、期间和之后getActiveCount()

  1. 已从池中分配N个线程用于任务执行,并且
  2. N个线程中没有一个可用于进一步的任务分配,

返回的整数getActiveCount()将恰好是N

如果getActiveCount()不提供此保证,是否有任何其他方式可以更准确地获取此信息?

之前的 SO 问题:

我查看了Thread Pool Executor Monitoring RequirementHow to tell if there is a available thread in a thread pool in java,但他们没有回答我的查询。

4

2 回答 2

10

它是近似的原因是因为在计算过程中数字可能会发生变化;你是多线程的。在计算完成之前,现在可以有不同数量的线程处于活动状态(检查时处于非活动状态的线程现在处于活动状态)。

当您说“特定时间实例”时……这并不意味着什么。计算不是即时的。考虑到池的流体/动态性质,您得到的数字是最好的答案。

如果碰巧在池中没有线程更改状态时计算开始并完成,那么是的,该数字是“精确的”,但仅在池中的线​​程更改状态之前,这意味着它可能只是“精确”1ms(或更少)。

于 2012-05-09T05:45:59.693 回答
2

我认为您可能会通过引入 ThreadPoolExecutor 的实现中并不存在的“重新加入池”的概念来混淆事情。

每个工作线程都在不断地等待任务(它实际上位于阻塞队列的顶部)。每个任务进入其队列,该工作人员被“锁定”,然后运行任何任务前内务处理,然后运行实际任务,然后是任务后内务处理,然后工作人员被“解锁”。

activeCount() 为您提供处于“锁定”状态的线程数:请注意,这意味着它们实际上可能在调用 activeCount() 的精确时刻进行“内务处理”,但要算作“活动”,有必须是实际涉及的任务,或者即将执行、当前执行或刚刚执行。

这是否等同于你的“重新加入池”的概念我不确定——正如我所说,你似乎在发明一个概念,从 ThreadPoolExecutor 的角度来看,严格来说并不存在。

于 2012-05-09T05:49:12.890 回答