2011-12-30 12 views

回答

12

...並將其他響應與Java Servlet環境的工作聯繫起來;

如果您沒有將線程聲明爲守護程序線程,那麼將服務器關閉通知給線程的方法是實現ServletContextListener並將其配置爲您的web應用程序(web.xml)。當Tomcat關閉時,它將首先關閉每個應用程序,這將導致調用監聽器的方法contextDestroyed() - 這是您可以向自己的線程表明他們應該完成其工作的位置。

+0

無論如何找出造成這個問題的線程,將對我有所幫助,因爲我也遇到了這個問題。 – Azim 2016-07-22 08:05:41

+0

您可以使用kill -3,jstack或tomcat經常轉儲catalina.out中的堆棧跟蹤。 – ticktock 2016-08-03 00:37:44

6

任何仍在運行的線程都會使Java(Tomcat)進程保持活動狀態。確保你所有的線程退出。一旦你的線程退出,Tomcat將能夠關閉。

查看javadoc的Thread。請注意以下幾點:

Java虛擬機繼續直至出現以下任何一種情況發生時執行線程:

  • Runtime類的exit方法已經被調用並且安全管理器允許退出操作發生。
  • 所有不是守護進程線程的線程都已死亡,無論是從調用返回的run方法還是通過拋出傳播超出run方法的異常。
+0

你能推薦任何工具,通過它我們可以檢查這些線程? – Azim 2016-07-22 07:43:48

5

您需要取消線程,最好通過調用它們interrupt並確保它們都寫在這樣一種方式,他們響應中斷 - 這意味着,檢查自己的中斷標誌,並智能地響應InterruptedExceptions (不只是吃它們並繼續)。

上述建議假設您不希望自己的線程立即放棄正在執行的操作。如果你確定,那麼讓他們守護進程。

+3

我使用創建自己的線程的第三部分庫的問題。與這些線程是問題。 – user710818 2011-12-30 14:49:18

+0

@ user710818:是的,這是一個不好的問題。我希望圖書館能夠提供一些方法讓你告訴他們做一個正常的關機。 – 2011-12-30 14:58:48

相關問題