2012-03-29 12 views
10

Używam ScheduledExecutorService w mojej aplikacji. Muszę używać go od czasu do czasu w niektórych klasach narzędziowych do uruchamiania zaplanowanych wątków.ScheduledExecutorService: kiedy należy wywołać zamknięcie systemu?

Czy jest to dobry projekt do przechowywania ScheduledExecutorService w polu statycznym? Czy w takim przypadku konieczne jest wywołanie metody ScheduledExecutorService.shutdown()? Jakie jest ryzyko, jeśli nie wezwę wyłączenia?

To co myślałem zrobić:

private static ScheduledExecutorService exec = Executors.newScheduledThreadPool(5); 

public void scheduleTask(String name) { 
     Future<?> future = futuresMapping.get(name); 
     if(future!=null && !future.isDone()) 
      future.cancel(true); 

     //execute once 
     Future<?> f = scheduledExecutor.schedule(new MyTask()), 1, TimeUnit.MINUTES); 
     futuresMapping.put(name, f); 
} 

Dziękuję

Odpowiedz

5

Powinieneś zawsze wywoływać shutdown() lub shutdownNow(). Jeśli tego nie zrobisz, twoja aplikacja może nigdy się nie zakończyć, ponieważ nadal są aktywne wątki (w zależności od tego, jak kończysz aplikację, czy to w zarządzanym środowisku, czy nie itp.).

Zwykle można wywołać metodę shutdown() z jakiejś metody zdarzenia cyklu życia - na przykład z Spring's DisposableBean.destroy() lub jeśli nie korzystasz z żadnej struktury, po prostu wywołaj ją przed wyjściem z aplikacji.

+0

Próbowałem dodać scheduleExecutor.shutdownNow(); w moim ServletContextListener, ale pojawia się błąd w dzienniku tomcat, mówiąc "Wydaje się, że aplikacja sieciowa [/ servlet] uruchomiła wątek o nazwie [Timer-0], ale nie udało się go zatrzymać. Jest to bardzo prawdopodobne, aby utworzyć przeciek pamięci. ". Jak mogę uniknąć tego błędu? Dzięki za pomoc – lili

+0

shutdownNow() to połączenie bez blokowania, które natychmiast powróciłoby. Powinieneś wywołać metodę awaitTermination() po tym, która będzie blokować do momentu, aż pula wątków zostanie faktycznie wyłączona. – maximdim

+0

Próbowałem, to nie zadziałało. Czy powinienem czekać dłużej niż 30 sekund? Napisałem więcej szczegółów na http://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnow thanks – lili

3

Efektywna Java 2. wyd mówi:

A oto jak powiedzieć wykonawcę, aby zakończyć wdziękiem (jeżeli nie powiedzie się to, to jest prawdopodobne, że twoja maszyna wirtualna nie wyjdzie):

executor.shutdown();