首页 文章

Java线程池 Actuator 监视

提问于
浏览
7

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

public int getActiveCount()返回正在执行任务的大致线程数 .

近似和积极执行在这里是什么意思?

如果在 getActiveCount() 之前,之中和之后有任何保证吗?

  • 已从池中分配了N个线程以执行任务,并且

  • 这些N个线程都不可用于进一步的任务分配,

getActiveCount() 返回的整数将是N?

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

Prior SO Questions:

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

2 回答

  • 9

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

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

    如果计算开始并完成,而池中的所有线程都没有更改状态,那么该数字是"exact",但只有在池中的线程更改状态时,这意味着它可能只有"exact" 1ms(或更少) .

  • 2

    我认为通过引入一个“重新加入池”的概念,你可能会混淆一些东西,而这个概念在ThreadPoolExecutor的实现中并不存在 .

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

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

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

相关问题