Executors.newSingleThreadExecutor() — как узнать, сколько задач находится в очереди

#java #multithreading

#java #многопоточность

Вопрос:

Я использую Executors.newSingleThreadExecutor() в своем коде. Я хочу отслеживать количество задач в очереди, чтобы убедиться, что procesor не перегружен сообщениями. Как я могу получить количество незаконченных отправленных задач на текущий момент? Я ожидаю чего-то подобного:

 ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(new Runnable() {...});
executor.submit(new Runnable() {...});
executor.submit(new Runnable() {...});
// do something and get 3
...
// do something and get 2
...
// do something and get 1
  

Спасибо

Комментарии:

1. И я цитирую, в любой момент времени будет активна не более одной задачи . Однако вы можете проверить, завершилась ли отправленная в данный момент задача, вызвав isDone() возвращенную Future .

2. здесь download.oracle.com/javase/6/docs/api/java/util/concurrent/…

3. «Я хочу отслеживать количество задач в очереди, чтобы убедиться, что procesor не перегружен сообщениями» И если это так, что вы собираетесь делать?

Ответ №1:

На всякий случай, если вы хотите гарантировать, что даже с новыми версиями JVM код, предложенный FlorianOver, будет работать, вы могли бы сделать это следующим образом: (Для случая, когда метод Executors.newSingleThreadExecutor() больше не будет возвращать экземпляр типа ThreadPoolExecutor)

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

// ...

int queueSize = executor.getQueue().size();
  

Комментарии:

1. 1, всегда вводите код в интерфейс. Все служебные методы в Executors возвращают тип интерфейса ExecutorService или ScheduledExecutorService , следовательно, реализация Executors не гарантирует, что возвращаемое будет распространяться на какую-либо конкретную реализацию (даже если существует только одна общедоступная реализация).

Ответ №2:

Разве это не так?

 ((ThreadPoolExecutor) executor).getQueue().size();
  

Комментарии:

1. -1, неверно. Это вызовет a, ClassCastException поскольку ExecutorService реализация, возвращаемая Executors.newSingleThreadExecutor() , является a FinalizableDelegatedExecutorService , а не a ThreadPoolExecutor (начиная с Java 6).