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ę
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
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
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