2013-09-24 3 views
1

Есть ли способ узнать в определенный момент времени, сколько runnables ожидает выполнения ExecutorService. Например, если предположить, что цикл вызывает метод execute быстрее, чем может выполнить runnable, и избыток накапливается, есть ли способ получить текущее количество накопленных runnables?Как найти количество runnables, ожидающих исполнения

ExecutorService es = Executors.newFixedThreadPool(50); 

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

ответ

4

Есть ли способ узнать, на данный момент времени, сколько runnables ждут, чтобы быть выполнены в ExecutorService.

Да. Вместо использования вызовов Executors... вы должны создать экземпляр своего собственного ThreadPoolExecutor. Ниже то, что 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

BlockingQueue и RejectedExecutionHandler .. Замечательно! –

0

Вы можете использовать реализацию ThreadPoolExecutor и позвонить по телефону toString().

Возвращает строку, идентифицирующую этот пул, а также его состояние, включая индикацию состояния запуска и подсчитанных счетчиков работ и задач.

Подробнее here

Есть несколько методов в этой реализации, чтобы получить Вас другой тип подсчетов.

Вы можете использовать следующие два метода:

public long getTaskCount() 

Возвращает приблизительное общее количество задач, которые когда-либо были запланированы для исполнения. Поскольку состояния задач и потоков могут динамически меняться при вычислении, возвращаемое значение является только приближением.

public long getCompletedTaskCount() 

Возвращает примерное общее количество задач, выполнение которых завершено.Поскольку состояния задач и потоков могут динамически меняться при вычислении, возвращаемое значение является только приближением, но которое никогда не уменьшается при последовательных вызовах.

Cheers !!

Смежные вопросы