我在我的應用程序中使用ScheduledExecutorService。我需要在某些Utility類中不時使用它來運行預定的線程。ScheduledExecutorService:何時應該調用shutdown?
在靜態字段中保存ScheduledExecutorService是一個好設計嗎?在這種情況下是否必須調用ScheduledExecutorService.shutdown()?如果我不調用關機會有什麼風險?
這就是我想這樣做:
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);
}
謝謝
我試着添加scheduledExecutor.shutdownNow();在我的ServletContextListener中,但是我在tomcat日誌中發現錯誤,說「Web應用程序[/ servlet]似乎已經啓動了一個名爲[Timer-0]的線程,但未能阻止它,這很可能導致內存泄漏。 」。我怎樣才能避免這個錯誤?感謝您的幫助 – lili 2012-03-29 17:20:32
shutdownNow()是非阻塞呼叫,將立即返回。之後應該調用awaitTermination(),直到線程池實際關閉爲止。 – maximdim 2012-03-29 17:45:01
我試過了,它沒有工作。我應該等30秒以上嗎?我在http://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnow上寫了更多的細節 謝謝 – lili 2012-03-29 17:47:56