2012-03-29 73 views
5

我正在使用ScheduledExecutorService來運行預定線程。
我實施了ServletContextListener.contextDestroyed並且調用了ScheduledExecutorService.shutdownNowawaitTerminationTomcat 7和ScheduledExecutorService.shutdown

下面是一個例子:

重度::

@Override 
public void contextDestroyed(ServletContextEvent servletcontextevent) { 
    pool.shutdownNow(); // Disable new tasks from being submitted 
    try { 
     // Wait a while for existing tasks to terminate 
     if (!pool.awaitTermination(50, TimeUnit.SECONDS)) { 
     pool.shutdownNow(); // Cancel currently executing tasks 
     System.err.println("Pool did not terminate"); 
     } 
    } catch (InterruptedException ie) { 
     // (Re-)Cancel if current thread also interrupted 
     pool.shutdownNow(); 
     // Preserve interrupt status 
     Thread.currentThread().interrupt(); 
    }   
} 


儘管如此,我從Tomcat 7得到以下錯誤Web應用[/ servlet的]似乎已經開始了 線程名稱爲[Timer-0]但無法停止它。這很可能是 創建內存泄漏。

該日誌可以忽略嗎?或者我做錯了什麼?

感謝

+0

我的意思是,我的想法是:你的清理責任在哪裏停止?還有什麼可以做的呢?用消防水帶打開箱子? 非常認真,我的意思是說,它看起來像你正在做的一切你能做的......我會忽略這個錯誤。 – ControlAltDel 2012-03-29 17:51:41

+0

你可以參考我以前的文章:) http://stackoverflow.com/questions/9926356/scheduledexecutorservice-when-shutdown-should-be-invoked – lili 2012-03-30 13:07:20

回答

4

您確定此錯誤與您的線程池有關嗎?通過線程名'Timer-0'來判斷它可能是由某種計時器啓動的。

另外,您shutdownNow()應該返回您仍然在等待終止的任務列表(請參閱JavaDoc)。如果list不是空的,你可以建立邏輯來等待更多。

1

你正確地關閉您的ScheduledExecutorService。不過,默認情況下由ExecutorService創建的線程遵循此命名約定:pool-X-thread-Y

Timer-0線程由Timer類創建。在您的代碼和庫中查找它們。