2013-02-20 14 views
18

Czy obiekt executora ma zostać ponownie użyty po shutdown? Mam na myśli, jeśli zadzwonię shutdown lub shutdownNow po zakończeniu executora, czy powinienem zrobić new, aby utworzyć nową pulę wątków, czy jest możliwe, aby jakoś "zresetować"/ponownie użyć poprzednio zakończonego executora i użyć go ponownie?Czy executor ma być ponownie użyty?

Aktualizacja:
Jeśli trzeba utworzyć nową pulę wątków, jak mogę „zrozumieć”, że poprzedni został zatrzymany?
E.g. Następujące:

public void startPool(){ 
    if(threadPool != null && !threadPool.isShutdown()){ 
    return; 
    } 
    threadPool = Executors.newCachedThreadPool(); 
    //other stuff 

} 

public void stopPool(){ 
    if(threadPool != null){ 
    threadPool.shutdown(); 
    } 
} 

Nie działa. Jeśli zadzwonię pod numer stop, a następnie start, nowa pula wątków nie zostanie utworzona z powodu warunków. Jaki jest właściwy sposób kodowania tego?

+1

nie powinno to być "... &&!threadPool.isShutdown() ', abyś powrócił wcześniej tylko wtedy, gdy TP nadal działa (tj. _started_)? –

+0

@RalfH: Dobry punkt! Zaktualizowany OP – Jim

+0

OK, a ty nazywasz 'stop', a następnie' start' z tego samego wątku? –

Odpowiedz

16

Od the doc:

Po rozwiązaniu umowy wykonawca testamentu nie ma zadania aktywnie wykonując żadnych zadania oczekujące na realizację, a żadne nowe zadania mogą być składane

tak (krótko), nie nie możesz go ponownie użyć. Od the shutdown() doc:

Inicjuje uporządkowane zamykanie, w którym wykonywane są wcześniej złożone zadania, ale żadne nowe zadania nie będą akceptowane.

Metody isTerminated() i isShutdown() mogą być używane do określenia, czy wykonawca został wyłączony i że zadania zostały zakończone odpowiednio.

+0

Zobacz aktualizację – Jim

5

1) Nie można ponownie użyć ThreadPoolExecutor Po wyłączeniu nim, API

An ExecutorService can be shut down, which will cause it to reject new tasks 

Uwaga: nie zamykania się ThreadPoolExecutor jeśli chcesz go ponownie użyć.

2) Jeśli chcesz wiedzieć, czy trzeba odtworzyć ThreadPoolEdxecutor używać

ExecutorService.isShutdown() 

Zwraca prawdę, jeśli wykonawca został zamknięty

+0

Zobacz aktualizację – Jim

+0

OK, zaktualizowałem też moją odpowiedź –

+0

Zasadniczo musiałbym zrobić 'threadPool = null' w' stop' right? Czy to byłby problem? – Jim

5

Mówimy o Oracla Javas ThreadPoolExecutor (wykonawczych wykonawca interfejs) tutaj. Tam komentarz dotyczący metody zamknięcia nie jawnie zakazuje przejścia Shutdown z powrotem do Działając, ale komentarz klasy wyszczególnia wszystkie przejścia obsługiwane przez ThreadPoolExecutors i nie ma możliwości powrotu od Shutdown. Powrót wymagałby innej metody ponownego uruchomienia lub podobnej. To nie istnieje, ale ktoś, kto uzna to za przydatne, może rozszerzyć interfejs i zaimplementować ponowne uruchamianie po zamknięciu bez przerywania semantyki zamykania. Mogłoby to być nieco trudniejsze, ponieważ samo zamknięcie nie gwarantuje, że przetwarzanie zostanie ostatecznie przerwane. Więc pracownicy mogą kontynuować, dopóki nie skończą, jeśli w ogóle skończą. Ponowne uruchomienie w tych warunkach prawdopodobnie nie było warte dodatkowej pracy w porównaniu do utworzenia kolejnego executora.

Powiązane problemy