簡體   English   中英

java守護程序線程

[英]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.

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