2016-03-20 33 views
5

używam ThreadPoolExecutor jak poniżej:java 8 threadPoolExecutor stucks po n zadań z instrukcji return

ThreadPoolExecutor pool = new ThreadPoolExecutor(cores, 50, 30L, 
TimeUnit.SECONDS, new ArrayBlockingQueue<>(10)); 

a:

pool.execute(()->{ 

//code goes here 

if(some condition){ 
    return; 
} 
//code goes here 
}) 

A kiedy ten blok z instrukcji return jest włączona, wszystkie te zadania dostaje utknął w TPE. TPE mówi, że jest w pełni załadowany i zawsze wyrzuca RejectedExecutionException wyjątek

Nie mogę zrozumieć, dlaczego tak się dzieje. Na przykład, jeśli masz pulę wielkości 10, a masz 100 zadań, 10 z nich będzie pasować, jeśli sekcja, nie zaakceptujesz 101. zadania, wszystkie następne zadania zostaną odrzucone. Czemu?

+0

Trudno powiedzieć, co poszło nie tak na podstawie tego opisu ... czy wykonano któreś z przesłanych zadań? może jest jakiś błąd w twoim kodzie zadań i są one proste zatrzymane ... – nukie

+0

Właściwie nie zaakceptujesz 11. zadania, ponieważ kolejka ma rozmiar 10 – Antoniossss

Odpowiedz

5

Nie prawidłowo skonfigurować swoją ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize, 
          int maximumPoolSize, 
          long keepAliveTime, 
          TimeUnit unit, 
          BlockingQueue<Runnable> workQueue) 

Tworzy nowy ThreadPoolExecutor z podanych parametrów początkowych i fabryki domyślny nici i odrzucone obsługi wykonania. Bardziej wygodne może być użycie jednej z metod fabrycznych Executorów zamiast tego konstruktora ogólnego przeznaczenia.

Parametry:

corePoolSize - liczba wątków, aby utrzymać się w basenie, nawet jeśli są one w stanie spoczynku, chyba allowCoreThreadTimeOut jest ustawiony

maximumPoolSize - maksymalna liczba wątków, aby umożliwić w basenie

- gdy liczba wątków jest większa niż rdzeń, jest to maksymalny czas, w którym nadmiar wolnych wątków będzie czekał na nowe zadania przed zakończeniem.

unit - jednostka czasu dla argumentu KeepAliveTime

workQueue - kolejki do wykorzystania do przechowywania zadań przed ich wykonaniem. Ta kolejka będzie zawierać tylko zadania Runnable przesłane przez metodę execute.

Nigdy nie widziałem TPE o rozmiarze workQueue (10) mniejszym niż maximumPoolSize (50). Przy obecnej konfiguracji 11 zadanie pracownika zostanie odrzucone z powodu rozmiaru kolejki 10 (rozmiar kolejki w tym momencie).

Zwiększ swój rozmiar o workQueue, aby pozbyć się RejectedExecutionException. 50 wątków może z łatwością obsłużyć ponad 1000 małych zadań. Skonfiguruj ten rozmiar kolejki w zależności od wymagań przy rozsądnej wartości.