5

У меня есть исполнитель, который отвечает за потребление сообщений от ArrayBlockingQueue.Что может быть причиной того, что поток будет стоять на java.util.concurrent.ThreadPoolExecutor.getTask

new ThreadPoolExecutor(1, 1, 0L, 
       TimeUnit.MILLISECONDS, 
       new LinkedBlockingQueue<>(1), 
       r -> { 
        return new Thread(r, "Request-Queue-Drainer"); 
       }); 

Request-Queue-Drainer поток находится в состоянии ожидания (Хотя задачи представляется в этой теме). Ниже приведена дамп потока.

Name: Request-Queue-Drainer 
State: WAITING on java.u[email protected]5b4757a2 
Total blocked: 0 Total waited: 8 

Stack trace: 
sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) 
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
java.lang.Thread.run(Thread.java:745) 

В чем причина того, что поток находится в состоянии ожидания?

+0

Что вы имеете в виду, «ответственный за удаление сообщений из очереди?» Здесь вы создаете очень обычный «ThreadPoolExecutor». Вы передаете ему явный «ThreadFactory», но единственное, что ваш «ThreadFactory» делает иначе, чем фабрика нитей по умолчанию, это дает каждому новому потоку специальное имя. –

ответ

4

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


Edit: Там что-то еще, что может произойти, когда очередь пуста: ThreadPoolExecutor может отправить в сообщении яд таблетки, который вызывает пул потоков, чтобы умереть, если число рабочих было больше, чем corePoolSize для более чем keepAlive единиц времени. Это не произойдет в вашем случае, потому что вы установили maximumPoolSize и corePoolSize на то же число (1).


Я не ожидаю ваш ThreadPoolExecutor вести себя по-другому от того, который будет возвращен по Executors.newFixedThreadPool(1) исключением того, что ваш может иметь только одну отложенную задачу, и это дает пул нить специальное название.

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