簡體   English   中英

在主線程退出后,惡魔線程繼續運行,並且還有一些非守護程序線程還在運行?

[英]Demon threads continue to run after main exited and there is some non-daemon thread still running?

我知道所有Demon線程在主出口退出后都會終止。 但是,如果有一些非守護線程在main退出后繼續運行,該怎么辦? 運行此非守護程序線程是否會阻止所有其他守護程序線程終止?

在主線程退出后,惡魔線程繼續運行,並且還有一些非守護程序線程還在運行?

當所有非守護程序線程都停止時,運行時將關閉。 因此,如果您啟動另一個非守護程序線程(例如事件隊列),則應用程序將繼續運行。

在JVM終止之前,守護程序線程不會關閉。

只要沒有線程調用System.exit並且有任何非守護進程線程仍在運行,JVM就不會終止。

因此,是的,運行的非守護程序線程可以防止JVM關閉,並且只要JVM處於活動狀態,它就不會強制終止守護程序線程。

Java語言規范的12.8程序退出

程序終止所有活動並在發生以下兩種情況之一時退出:

  • 不是守護程序線程的所有線程都終止。

  • 某些線程調用類Runtime或System類的exit方法,並且安全管理器不禁止退出操作。

因此,請確保確保正確關閉線程。 在一個項目中,我有一個定期寫入文件的后台線程,並且我試圖弄清為什么文件內容發生了巨大變化。 究其原因,是因為后台線程沒有關閉,因此即使新啟動的應用程序也在向文件寫入數據,后台線程也始終保持運行狀態。 ps -af | grep java ps -af | grep java表明,有2個Java進程在運行,應該有1個。

為什么不自己檢查呢?

public static void main(String[] ...){
Thread t1=new Thread(()=>{for(;;);});
t1.setDeamon(true);

Thread t2=new Thread(()=>{for(;;){System.out.println(new Date())}});
t2.setDeamon(false);

t1.start();
t2.start();
Thread.currentThread().sleep(1000);
}

並檢查JVM是否終止。 如果您的CPU 100%忙,則不忙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM