2012-10-10 95 views
22

在我的webapp中,我創建了一個使用固定大小的ThreadPool的ExecutorService的服務。我在整個應用程序生命週期中重複使用相同的ExecutorService在webapp中優雅地關閉ExecutorService?

private static ExecutorService pool = Executors.newFixedThreadPool(8); 

所有在Tomcat的運行時書亭下降,這使我有以下錯誤:

appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak. 

我意識到我需要書亭的tomcat下來之前關閉ExecutorService的。索姆斯SO線程已經談論這個,但我找不到一個乾淨的方式來處理這個問題。

我應該使用ShutdownHook建議@ Tim-bender在Graceful shutdown of threads and executor?還是應該使用CachedThreadPool來代替?

回答

25

關機鉤是不是在Tomcat的一個好方法,因爲:

  • 它將關閉游泳池太晚了(在關機),Tomcat將已經警告你沒有關閉資源

  • 你居然想要在應用程序未部署時關閉該池,以便重新部署工作(否則每個應用程序將創建新池,並且它們將僅在完全關閉時關閉)

  • 關閉線程池可能需要一些時間(見下文),關閉掛鉤應該是儘可能快

好多地方是ServletContextListener.contextDestroyed()。請記住,您必須同時存儲池shutdownNow()(取消運行並拒絕新任務)和awaitTermination(),以等待已運行的任務完成並停止所有線程。

+1

正是我需要知道的 –

7

除了托馬斯什麼建議,你也可以使用未使用60秒CachedThreadPool

線程終止,並從緩存中刪除。因此,對於長期保持足夠的空閒池不會消耗任何資源

所以一個很好的解決辦法是使用CachedThreadPool和關閉它在ServletContextListener.contextDestroyed()

+4

+1 congrats for 5K –

+0

@NandkumarTekale謝謝。看上去不錯 :) –