[英]Is Java thread a daemon 'if and only if' the creating thread is a daemon?
[英]Daemon thread in java
我對守護程序線程感到困惑。在大多數站點中,它被寫入,它在應用程序停止時終止但是如果應用程序連續運行會怎樣。
...但是如果應用程序連續運行會怎么樣
然后守護程序線程繼續運行。
(這假設有問題的線程不會從其run()
方法返回,或者因未捕獲的異常而死亡。)
將線程標記為“守護程序”的目的是告訴JVM在啟動關閉之前不需要等待線程完成。 (關閉的另一種方法是讓一些線程調用System.exit()
。即使有其他非守護進程線程,也會啟動關閉。)
跟進
我有一個在tomcat服務器下連續運行的應用程序,我從注釋中推斷出守護程序線程創建的注釋不會因為應用程序沒有停止而停止,但是如果我們嘗試直接停止tomcat服務器會產生內存泄漏嗎?
如果停止webapp(但不是tomcat服務器),則守護程序線程將繼續運行。 如果你想讓你的webapp創建的線程消失,你必須編寫你的webapp來監聽相關的上下文事件,並中斷(或其他)線程使它們關閉。
如果你關閉tomcat,那么一切都會消失,包括守護進程線程:
當您成功停止tomcat服務器(例如“catalina.sh stop”)時,JVM退出並且所有線程(守護程序或其他)死亡。
運行“catalina.sh stop” 可能會失敗,但僅僅存在一個守護程序線程不會導致它失敗。
無法停止可能是由於某些webapp在其關閉事件處理中陷入困境,或者可能是由於tomcat服務器處於掛起或無響應狀態。 在至少某些版本的Tomcat中,非守護程序線程的存在足以導致關閉失敗。)
如果你運行“catalina.sh stop -force”,那么如果tomcat實例在5秒內無法關閉,那么它將被終止; 請參閱“catalina.sh help”或腳本的來源。
當您關閉並重新啟動tomcat時,線程泄漏和內存泄漏都沒有實際意義。 實際上,這是泄漏的經典解決方法。
正確。 只有在所有非守護程序線程完成后,應用程序才會退出。 這不適用於守護程序線程。
澄清:
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
while (true) {
// do something...
}
}
}
thread.setDaemon(true);
thread.start();
}
以上將立即退出。 但是,如果省略thread.setDaemon(true),程序將不會終止。
守護程序線程在其run方法返回時停止,或者在JVM中不再運行非守護程序線程時停止。 如果永遠運行非守護程序線程,並且守護程序線程的run方法永遠不會返回,則守護程序線程也會永遠運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.