具有 运行 个任务的 ExecutorService
ExecutorService with number of running tasks
我想获取已提交给执行程序服务但尚未完成(即当前 running/active 或正在排队)的任务数。执行器服务没有内置方法。
((ThreadPoolExecutor) executorService).getActiveCount()
这个"Returns the approximate number of threads that are actively executing tasks."
这是维护可变计数器的有效替代方法吗?
为什么是近似值?
我真的会更好地维护柜台吗?
为什么执行程序服务没有为此内置的方法?
我们来看任务:只能告诉你确切的数字,如果你停止系统,计数,return,启动系统。
否则:在计数期间,线程可能会开始和结束,因此该数字是一个近似值。
查看 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 }
实现很简单,但就像数蚂蚁而不杀死它们:你数的时候它们会来来去去。
我想获取已提交给执行程序服务但尚未完成(即当前 running/active 或正在排队)的任务数。执行器服务没有内置方法。
((ThreadPoolExecutor) executorService).getActiveCount()
这个"Returns the approximate number of threads that are actively executing tasks."
这是维护可变计数器的有效替代方法吗? 为什么是近似值? 我真的会更好地维护柜台吗? 为什么执行程序服务没有为此内置的方法?
我们来看任务:只能告诉你确切的数字,如果你停止系统,计数,return,启动系统。 否则:在计数期间,线程可能会开始和结束,因此该数字是一个近似值。
查看 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 }
实现很简单,但就像数蚂蚁而不杀死它们:你数的时候它们会来来去去。