5

Mam executor odpowiedzialny za pobieranie wiadomości z ArrayBlockingQueue.Co może być przyczyną zapamiętywania wątku w java.util.concurrent.ThreadPoolExecutor.getTask

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

Wątek żądania kolejkowania jest w stanie OCZEKIWANIA (Chociaż zadania są przesyłane do tego wątku). Poniżej znajduje się zrzut wątku.

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) 

Jaki może być powód, dla którego wątek ma status oczekiwania?

+0

Co masz na myśli, "odpowiedzialny za odprowadzanie wiadomości z kolejki?" Tworzysz tutaj bardzo zwyczajnie wyglądający "ThreadPoolExecutor". Przekazujesz mu wyraźną "ThreadFactory", ale jedyną rzeczą, z którą twoja "ThreadFactory" różni się od domyślnej fabryki nici, jest nadanie każdemu nowemu wątkowi specjalnej nazwy. –

Odpowiedz

4

Wątek oczekuje, ponieważ kolejka jest pusta. To właśnie robią wątki puli: wybierają zadania z kolejki i uruchamiają je, a gdy kolejka jest pusta, czekają.


Edit: Jest coś innego, co może zdarzyć, gdy kolejka jest pusta: The ThreadPoolExecutor można wysłać w wiadomości poison pill, który powoduje wątku basen umrzeć, jeżeli liczba pracowników była większa niż corePoolSize dla więcej niż keepAlive jednostek czasu. Nie stanie się to jednak w twoim przypadku, ponieważ ustawisz maximumPoolSize i corePoolSize na ten sam numer (1).


nie oczekiwać ThreadPoolExecutor zachowywać się w sposób odmienny od tego, który zostanie zwrócony przez Executors.newFixedThreadPool(1) chyba że twój może mieć tylko jedno oczekujące zadanie, a to daje puli wątków specjalną nazwę.

Powiązane problemy