Java 如何';近似值';ThreadPoolExecutor#getActiveCount()是吗?

Java 如何';近似值';ThreadPoolExecutor#getActiveCount()是吗?,java,multithreading,concurrency,Java,Multithreading,Concurrency,的javadocs表示,该方法“返回正在积极执行任务的线程的大致数量。” 是什么使这个数字近似而不精确?它会报告活动线程吗 方法如下: /** * Returns the approximate number of threads that are actively * executing tasks. * * @return the number of threads */ public int getActiveCount() { final ReentrantLock m

的javadocs表示,该方法“返回正在积极执行任务的线程的大致数量。”

是什么使这个数字近似而不精确?它会报告活动线程吗

方法如下:

/**
 * Returns the approximate number of threads that are actively
 * executing tasks.
 *
 * @return the number of threads
 */
public int getActiveCount() {
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        int n = 0;
        for (Worker w : workers)
            if (w.isLocked())
                ++n;
        return n;
    } finally {
        mainLock.unlock();
    }
}

该方法获取工作者列表并统计被锁定的工作者

当计数到达列表末尾时,先前计数的一些工人可能已经完成。(或者一些未使用的工人可能被分配了任务。)


但是作为一个客户,你不应该依赖这些知识,只是因为这是一个尽最大努力的近似值。请注意,这种“不准确”并不是由于草率的实现造成的,而是每个真正的多线程系统所固有的。在这样的系统中,没有“现在”的全局时刻。即使您停止所有工作线程的计数,在返回结果时,也可能不准确。

因此,这意味着您得到的数字可能大于活动线程的实际数量(如果某些线程在您完成计数时已完成)@eric它可能大于或小于。没办法说。事实上,在多线程系统中,问题本身没有多大意义。谢谢,我会在四分钟内接受这个答案,让我:-)另一种说法是:该方法可能做的最好的事情是在某个时刻返回一个正确的结果,但在调用方可以根据结果做出决定之前,那一刻将会过去。当我写下“该方法可能达到的最佳效果”时,我想到的是你的“停止所有工人数一数”。理论上是可能的,但并不明智。我试图提请大家注意,当我们试图证明多线程程序的正确性时,我们可能不得不接受比单线程程序更弱的“正确性”。例如,无法证明在提供信息的生产者之间没有“之前发生”关系时,项目在无锁队列中出现的顺序。或者,正如你所说,“没有全球性的当下时刻。”