2012-04-30 12 views
33

W kontynuacji do question zamieszczonych przeze mnie, próbuję użyć ThreadPoolExecutor w mojej bazie kodów. Nawet po wielokrotnych próbach zrozumienia z dokumentu Java API nie udało mi się jasno zrozumieć funkcji/celu parametru keepAliveTime do przekazania w konstruktorze. Mam nadzieję, że ktoś może mi wytłumaczyć dobrym przykładem.Jak działa Keep-alive z ThreadPoolExecutor?

Fragmenty Java Doc:

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

keepAliveTime - gdy liczba wątków jest większa niż rdzeń, to maksymalny czas, że nadmiar nici idle będzie czekać na nowe zadania przed zakończeniem.

+2

Podobnie jak punkt terminologii, masz dwa razy użył słowa „wdrożenie”, gdy myślę, że po prostu znaczy „użytkowania”. Nie próbujesz * zaimplementować * 'ThreadPoolExecutor', pisząc własny kod implementujący ten interfejs API - właśnie tworzysz' ThreadPoolExecutor' i chcesz wiedzieć, jak będzie się zachowywał, prawda? –

+0

Tak, masz rację. Po prostu miałem na myśli, że jest to nowy rodzaj implementacji w mojej bazie kodu. – Gnanam

+0

Ale to nie jest implementacja * 'ThreadPoolExecutor'. To naprawdę pomocne, jeśli możesz odpowiednio użyć terminologii - * szczególnie * w Stack Overflow. –

Odpowiedz

47

Załóżmy, że masz rozmiar rdzenia 5 i maksymalny rozmiar 15. Z jakiegoś powodu twój basen jest zajęty i używa wszystkich 15 dostępnych wątków. W końcu zabraknie ci pracy - niektóre z twoich wątków stają się bezczynne, kiedy kończą swoje ostatnie zadanie. Tak więc 10 z tych wątków może umrzeć.

Jednak, aby uniknąć ich zbytniego zabicia, można określić czas pozostawania przy życiu. Jeśli podasz 1 jako wartość keepAliveTime i TimeUnit.MINUTE jako wartość unit, każdy wątek będzie czekać jedną minutę po zakończeniu wykonywania zadania, aby sprawdzić, czy jest więcej pracy do wykonania. Jeśli jeszcze nie otrzymałoby się więcej pracy, pozwoliłoby to na ukończenie, dopóki w puli nie byłoby tylko 5 wątków - "rdzenia" puli.

+2

Jeśli zrozumiałem to poprawnie, 'keepAliveTime' jest używane/działa" tylko ", gdy wątki w puli mają więcej niż rozmiar rdzenia. To * nie * ma zastosowanie, gdy wątki w puli znajdują się poniżej rozmiaru rdzenia. – Gnanam

+0

Przepraszamy, jeśli to pytanie jest zbyt proste. Ale dlaczego chcemy utrzymać wątki przy życiu, które naprawdę zakończyły wykonywanie zadania? W każdym razie maksymalna liczba wątków ("maximumPoolSize") dozwolona w puli jest ograniczona, prawda? – Gnanam

+2

Punkt zabijania wątków jest taki sam, jak punkt posiadania puli wątków - nie marnując niepotrzebnych zasobów. –

3

Oto kilka opis z Javadoc:

<dt>Keep-alive times</dt> 
* 
* <dd>If the pool currently has more than corePoolSize threads, 
* excess threads will be terminated if they have been idle for more 
* than the keepAliveTime (see {@link 
* ThreadPoolExecutor#getKeepAliveTime}). This provides a means of 
* reducing resource consumption when the pool is not being actively 
* used. If the pool becomes more active later, new threads will be 
* constructed. This parameter can also be changed dynamically 
* using method {@link ThreadPoolExecutor#setKeepAliveTime}. Using 
* a value of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS} 
* effectively disables idle threads from ever terminating prior 
* to shut down. 
* </dd> 
* 

Zasadniczo to właśnie pozwala kontrolować liczbę wątków pozostawione w bezczynności basenie. Jeśli uczynisz to zbyt małym (dla tego, co robisz), będziesz tworzyć zbyt wiele wątków. Jeśli zrobisz to za duże, zużyjesz pamięć/wątki, których nie potrzebujesz.

Powiązane problemy