Java线程池执行器监视

时间:2012-05-09 05:29:53

标签: java monitoring threadpool

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

  

public int getActiveCount()

     

返回大致的线程数   正在积极执行任务。

此处近似正在执行的含义是什么?

如果在致电getActiveCount()

之前,期间和之后,是否有任何保证
  1. N 线程已从池中分配以执行任务,
  2. 这些 N 线程中没有一个可用于进一步分配任务,
  3. getActiveCount()返回的整数将完全 N

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

    之前的SO问题:

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

2 个答案:

答案 0 :(得分:9)

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

当你说“特定时间实例”时......这并不意味着什么。计算不是即时的。鉴于泳池的流体/动态特性,您获得的数字是最佳答案。

如果通过 chance 计算开始并完成,而池中的任何线程都没有更改状态,那么该数字是“确切的”,但只有在池中的线​​程改变状态时,这意味着它可能只是“精确”1ms(或更短)。

答案 1 :(得分:2)

我认为你可能通过引入一个“重新加入池”的概念来混淆事物,而这个概念在ThreadPoolExecutor的实现中并不存在。

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

activeCount()为您提供处于“锁定”状态的线程数:请注意,这意味着它们实际上可以在调用activeCount()的确切时刻进行“内务处理”,但这被视为“活动” ',实际上必须涉及一项任务,无论是将来,当前还是刚被执行。

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