2015-10-26 7 views
5

Mam serwer, który ma wiele wątków roboczych zaimplementowanych przy użyciu executora wykonawczego java (tj. Puli wątków)Znajdź liczbę zadań oczekujących na wątek z puli usług wykonawców (JAVA)?

Mój problem polega na tym, że nie jestem w stanie rejestrować co sekundę czasu oczekiwania na przetworzenie, jeśli istnieje nie jest dostępny bezczynny wątek z puli wątków.

UWAGA: Logowanie nie jest moim problemem, ale chcę mieć możliwość zobaczenia, ile zadań/zadań oczekuje na przetworzenie przez wątek roboczy, czy mimo to można sprawdzić długość kolejki oczekujących (nie pulę wątków) w usłudze executora?

Nie mam pojęcia, jak to wdrożyć.

Odpowiedz

12

Konstruktor ThreadPoolExecutor akceptuje parametr BlockingQueue, który jest implementacją Queue używaną do przechowywania zadań oczekujących. Możesz poprosić tę kolejkę korzystając getQueue() metodę, a następnie sprawdzić rozmiar kolejki:

System.out.println("Number of waiting jobs: "+executor.getQueue().size()); 

pamiętać, że ta metoda nie jest dostępna w interfejsie ExecutorService, więc lepiej skonstruować ThreadPoolExecutor wyraźnie zamiast korzystania Executors.newFixedThreadPool i przyjaciół :

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

Podczas Executors.newFixedThreadPool w OpenJDK/OracleJDK robi to samo, to nie jest określona, ​​więc używając (ThreadPoolExecutor)Executors.newFixedThreadPool(nThreads) może powodować ClassCastException w przyszłych wersjach alternatywnych implementacji Java lub JDK.

+0

jest tam również sposób, aby uzyskać liczbę wątków oczekujących na sondowanie jakiś zasób z arrayblockingqueue? – LoveMeow

+0

@LoveMeow, wątpię. Ale możesz sprawdzić inne metody 'ThreadPoolExecutor' jak' getTaskCount() ',' getActiveCount() ', itd. Prawdopodobnie odpowie ci na twoje pytanie. –

3

Jeśli można zakładać, że realizacja ExecutorService wykorzystywane przez serwer jest ThreadPoolExecutor, to można użyć metody getQueue() zwracającą liczbę zadań, które nie zostały przypisane do Worker jeszcze.

/** 
* Returns the task queue used by this executor. Access to the 
* task queue is intended primarily for debugging and monitoring. 
* This queue may be in active use. Retrieving the task queue 
* does not prevent queued tasks from executing. 
* 
* @return the task queue 
*/ 
public BlockingQueue<Runnable> getQueue() { 
    return workQueue; 
} 

Więc można uruchomić coś takiego:

if(LOGGER.isDebugEnabled()) { 
    LOGGER.debug(String.format("Pending tasks: %d", executor.getQueue().size())); 
} 
0

Podobnie jak sugestia użycia ThreadPoolExecutor zamiast ExecutorService. Możesz skorzystać z kolejki blokowania obecnej w klasie ThreadPoolExecutor. Daje to liczbę oczekujących wątków.

Również klasa ThreadPoolExecutor ma metody pozwalające uzyskać liczbę przesłanych zadań i wykonanych zadań.

skierować

ThreadPoolExecutor

BlockingQueue

Nadzieja to pomaga

Powiązane problemy