Java 6文档中的ThreadPoolExecutor类具有以下方法
public int getActiveCount()返回正在积极执行任务的线程的大致数目。
在这里近似和主动执行意味着什么?
如果在调用getActiveCount()之前、期间和之后,是否有任何保证
getActiveCount()返回的整数将精确为N
如果getActiveCount()不提供这一保证,是否有其他方法以更精确的方式获取这些信息?
优先问:
我看过线程池执行器监视要求和如何判断java中的线程池中是否有可用线程,但是他们没有回答我的问题。
发布于 2012-05-09 05:45:59
之所以是近似的原因是因为在计算过程中,数字可能会发生变化;您是多线程。在计算完成之前,不同数量的线程现在可能处于活动状态(选中时处于非活动状态的线程现在处于活动状态)。
当你说“特定的时间实例”..。这并不意味着什么。计算不是瞬时的。考虑到池的流动性/动态性,你得到的数字是最好的答案。
如果偶然地计算开始并完成,而池中的线程没有一个更改状态,那么是的,这个数字是“确切的”,但只有在池中的线程更改状态时才是正确的,这意味着它可能只对1ms (或更少)是“精确”的。
发布于 2012-05-09 05:49:12
我认为您可能是通过引入“重新加入池”的概念来混淆事情的,而这种概念在ThreadPoolExecutor的实现中并不真正存在。
每个工作线程持续地等待一个任务(它实际上位于阻塞队列的顶部)。每一个任务进入其队列,该工作人员被“锁定”,然后运行任何任务前的内务管理,然后实际的任务运行,然后是任务后的内务管理,然后工人是“解锁的”。
activeCount()给出处于“锁定”状态的线程数:请注意,这意味着它们实际上可以在调用activeCount()的精确时刻执行‘内务管理’,但是要计算为‘活动’,必须有一个实际涉及的任务,要么即将执行,要么刚刚执行。
这是否等同于你的“重新加入池”的概念,我不确定--正如我说的,你似乎在发明一个严格来说从ThreadPoolExecutor的角度来说并不存在的概念。
https://stackoverflow.com/questions/10510300
复制相似问题