如何查找等待执行的runnable数量

时间:2013-09-24 15:23:40

标签: java concurrency threadpool

是否有任何方法可以在给定时间点知道ExecutorService等待执行的runnable有多少。例如,假设循环调用execute方法的速度比runnable可以完成并且剩余累积更快,那么无论如何都要获得累积的runnables的运行计数?

ExecutorService es = Executors.newFixedThreadPool(50);

while (test) {
    es.execute(new MyRunnable());
}

2 个答案:

答案 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()

如果您希望限制队列中的作业数量,这样就不会太过分,那么您应该使用有界BlockingQueueRejectedExecutionHandler。请在此处查看我的回答:Process Large File for HTTP Calls in Java

答案 1 :(得分:0)

您可以使用ThreadPoolExecutor实施并调用toString()方法。

返回标识此池及其状态的字符串,包括运行状态和估计的工作和任务计数的指示。

了解更多here

此实现中有更多方法可以为您提供不同类型的计数。

您可以使用以下两种方法:

public long getTaskCount()

返回已安排执行的大致任务总数。由于任务和线程的状态可能在计算过程中动态变化,因此返回的值只是近似值。

public long getCompletedTaskCount()

返回已完成执行的大致任务总数。因为任务和线程的状态可能在计算过程中动态改变,所以返回的值只是一个近似值,但是在连续的调用中不会减少。

干杯!!