具有正在运行的任务数的ExecutorService

时间:2015-02-03 17:14:54

标签: java executorservice threadpoolexecutor

我想获得提交给执行服务但尚未完成的任务数(即当前正在运行/活动或排队)。 Executor服务没有内置的方法。

((ThreadPoolExecutor) executorService).getActiveCount()

这“返回正在执行任务的大致线程数。”

这是否是维持易失性计数器的有效替代方案? 为什么它是近似的? 我真的会更好地维持一个柜台吗? 为什么执行程序服务没有内置方法呢?

1 个答案:

答案 0 :(得分:2)

让我们看一下这个任务:如果你停止系统,计数,返回,启动系统,只能告诉你确切的数字。 否则:在计数期间,线程可能开始和结束,因此数字是近似值。

请参阅OpenJDK8中的实现:

1812    public int More ...getActiveCount() {
1813        final ReentrantLock mainLock = this.mainLock;
1814        mainLock.lock();
1815        try {
1816            int n = 0;
1817            for (Worker w : workers)
1818                if (w.isLocked())
1819                    ++n;
1820            return n;
1821        } finally {
1822            mainLock.unlock();
1823        }
1824    }

实施是直截了当的,但这就像计算蚂蚁而不杀死它们一样:它们会在你计算时来去匆匆。