#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()
, является aFinalizableDelegatedExecutorService
, а не aThreadPoolExecutor
(начиная с Java 6).