我有一個ExecutorService executor = Executors.newSingleThreadExecutor();
,我想在服務器關閉時停止。當停止Tomcat時,ExecutorService不會從contextDestroyed()中關閉
我有一個類,implements ServletContextListener
,它的註釋與@WebListener
。
我有這個類的兩個方法:
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContextListener started");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
executor.shutdown();
executor.shutdownNow();
System.out.println("ServletContextListener destroyed");
}
而且我看到它打印出什麼是在他們兩人的時候它應該,但是當我再按下intelij停止按鈕,我得到:
嚴重:Web應用程序[]似乎已啓動名爲[pool-2-thread-1]的線程,但未能停止它。這很可能造成內存泄漏。
緊隨其後印刷ServletContextListener destroyed
。
我需要再次按下停止按鈕以完全停止它。
爲什麼即使達到了executor.shutdown();
也沒有關閉ExecutorService?我究竟做錯了什麼? PS:這是我唯一的ExecutorService,沒有其他線程是由我製作的。
EDIT2:
執行人服務是在一個單獨的類的字段,它與類初始化:
private ExecutorService executor = Executors.newSingleThreadExecutor();
這是類如何初始化(延遲初始化):
public static RoomsManager getRoomsManager(ServletContext servletContext) {
if (servletContext.getAttribute(MANAGER_GAMES_ATTRIBUTE_NAME) == null) {
servletContext.setAttribute(MANAGER_GAMES_ATTRIBUTE_NAME, new RoomsManager());
}
return (RoomsManager)servletContext.getAttribute(MANAGER_GAMES_ATTRIBUTE_NAME);
}
並註明如下:
@WebListener
public class RoomsManager implements ServletContextListener {
停止按鈕是intelij IDEA中播放和調試按鈕附近的紅色正方形。
你可以在這些行上實現關閉嗎? http://stackoverflow.com/questions/36644043/how-to-forcefully-shutdown-java-executorservice/36644320#36644320 –
@Ravindrababu我把它複製到'contextDestroyed()',它沒有改變任何東西。它不打印'(「池沒有終止」);'雖然。我也嘗試了1秒而不是60. – shinzou
如果(!pool.awaitTermination(60,TimeUnit.SECONDS))條件改變,而條件和睡眠時間爲60秒。而我(!pool.awaitTermination(60,TimeUnit.SECONDS)){Thread.sleep(1000);} –