[英]java daemon threads
嗨所有,當封閉它的線程完成后,守護程序線程是否會停止工作? 或者“主”線程完成時守護程序線程會停止嗎?
我在jre6上測試了這個例子,結果是daemon thread stopped working when the enclosing it thread finished
。 請注意,java docs表示當沒有其他應用程序線程時,守護程序線程將被終止。 並且不會說父級非守護程序線程保留時會殺死守護程序線程。
請給我答案。 請寄給我關於這個問題的任何材料。 對不起我的英語不好。
public class Main {
public static void main(String[] args) {
Thread simple = new Thread(new SimpleTask());
simple.start();
}
}
class SimpleTask implements Runnable {
public void run() {
try {
Thread daemon = new Thread(new DaemonTask());
daemon.setDaemon(true);
daemon.start();
Thread.sleep(5000);
} catch (InterruptedException e) {}
};
}
class DaemonTask implements Runnable {
public void run() {
int i = 0;
while (true) {
try {
System.out.println("a" + (i++));
Thread.sleep(500);
} catch (InterruptedException e) {}
}
}
}
當封閉它的線程完成時,守護程序線程是否會停止工作?
Java中沒有“封閉線程”這樣的概念。 有線程組但它們很少使用。
守護程序線程只是線程,不會阻止JVM終止。 如果沒有任何非守護程序線程,JVM將終止。 如果仍有一些非守護程序線程正在執行,JVM將繼續運行,包括任何守護程序線程 - 無論啟動這些守護程序線程的線程是否已完成。
嗨所有,當封閉它的線程完成后,守護程序線程是否會停止工作? 或者“主”線程完成時守護程序線程會停止嗎?
當主執行線程和所有用戶線程終止執行時,JVM將停止守護程序線程。 然后,您的守護程序線程嚴格依賴於用戶線程的執行和程序的主線程。
相反,JVM將關閉您的程序,直到所有用戶線程都已終止。
作為回顧, 用戶線程是一個阻止程序退出的線程 ,因為即使程序的主線程被終止,JVM也不會在所有用戶線程完成所請求的作業之前停止程序。 只有當所有用戶線程都已終止時,JVM才能關閉程序。
然后, 守護程序線程是一個不會阻止程序退出的線程 。 對於其他信息,請檢查該 SO的老問題。
檢查Thread API 。 setDaemon()
方法的文檔報告如下:
將此線程標記為守護程序線程或用戶線程。 當運行的唯一線程都是守護程序線程時,Java虛擬機退出。
或運行時API :
Java虛擬機關閉以響應兩種事件:
1)當最后一個非守護程序線程退出或調用退出(等效,System.exit)方法時,程序正常退出,或者
2)響應用戶中斷(例如鍵入^ C)或系統范圍的事件(例如用戶注銷或系統關閉)終止虛擬機。
由於主線程在啟動簡單線程后立即結束,因此簡單線程是最后完成的應用程序線程,因此守護線程在此線程結束時結束。
簡單線程是啟動守護程序線程的線程與此無關。
守護程序線程停止工作,因為沒有任何非守護程序線程,而不是因為父線程已完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.