是否有任何方法可以在给定时间点知道ExecutorService
等待执行的runnable有多少。例如,假设循环调用execute方法的速度比runnable可以完成并且剩余累积更快,那么无论如何都要获得累积的runnables的运行计数?
ExecutorService es = Executors.newFixedThreadPool(50);
while (test) {
es.execute(new MyRunnable());
}
答案 0 :(得分:4)
有没有办法知道在给定的时间点ExecutorService等待执行的runnable有多少。
是。您应该实例化自己的ThreadPoolExecutor
,而不是使用Executors...
调用。以下是Executors.newFixedThreadPool(50)
返回的内容:
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(50, 50,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
获得ThreadPoolExecutor
后,它会有一个number of getter methods,可以为您提供有关池的数据。未完成的工作数量应为:
threadPool.getQueue().getSize();
ThreadPoolExecutor
也提供:
getActiveCount()
getCompletedTaskCount()
getCorePoolSize()
getLargestPoolSize()
getMaximumPoolSize()
getPoolSize()
getTaskCount()
如果您希望限制队列中的作业数量,这样就不会太过分,那么您应该使用有界BlockingQueue
和RejectedExecutionHandler
。请在此处查看我的回答:Process Large File for HTTP Calls in Java
答案 1 :(得分:0)
您可以使用ThreadPoolExecutor
实施并调用toString()
方法。
返回标识此池及其状态的字符串,包括运行状态和估计的工作和任务计数的指示。
了解更多here
此实现中有更多方法可以为您提供不同类型的计数。
您可以使用以下两种方法:
public long getTaskCount()
返回已安排执行的大致任务总数。由于任务和线程的状态可能在计算过程中动态变化,因此返回的值只是近似值。
public long getCompletedTaskCount()
返回已完成执行的大致任务总数。因为任务和线程的状态可能在计算过程中动态改变,所以返回的值只是一个近似值,但是在连续的调用中不会减少。
干杯!!