1

有什么方法可以知道在给定的时间点有多少可运行对象等待由ExecutorService. 例如,假设循环调用execute方法的速度比runnable完成的速度快,并且累积了盈余,那么无论如何要获得累积的runnables的运行计数吗?

ExecutorService es = Executors.newFixedThreadPool(50);

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

2 回答 2

4

有什么方法可以知道在给定的时间点有多少可运行对象等待 ExecutorService 执行。

是的。而不是使用Executors...调用,您应该实例化自己的ThreadPoolExecutor. 以下是Executors.newFixedThreadPool(50)返回的内容:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(50, 50,
           0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());

一旦你有了ThreadPoolExecutor,它就有许多 getter 方法可以为你提供池中的数据。未完成工作的数量应为:

threadPool.getQueue().getSize();

还可以从ThreadPoolExecutor以下位置获得:

  • getActiveCount()
  • getCompletedTaskCount()
  • getCorePoolSize()
  • getLargestPoolSize()
  • getMaximumPoolSize()
  • getPoolSize()
  • getTaskCount()

如果您想限制队列中的作业数量以免提前太多,您应该使用有界BlockingQueueRejectedExecutionHandler. 在这里查看我的答案:Process Large File for HTTP Calls in Java

于 2013-09-24T15:26:36.613 回答
0

您可以使用ThreadPoolExecutor实现和调用toString()方法。

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

在这里阅读更多

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

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

public long getTaskCount()

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

public long getCompletedTaskCount()

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

干杯!!

于 2013-09-24T15:31:36.063 回答