1. 程式人生 > >Java 多線程(四)之守護線程(Daemon)

Java 多線程(四)之守護線程(Daemon)

機會 兩種 如何 產生 tex begin 就會 set final

定義

Java 中有兩種線程: 一種是用戶線程(User Thread),一種是守護線程(Daemon Thread)。

守護線程是一種特殊的線程, 它的特殊有“陪伴”的含義, 當線程中不存在非守護線程時, 則守護線程自動銷毀。

垃圾回收線程就是一種守護線程, 當線程中沒有非守護線程了, 則垃圾回收線程就會自動銷毀。

因此, 守護線程的作用就是為其他非守護線程的線程服務, 當非守護線程不存在時, 其自然就沒有存在的必要了。

如何創建

創建過程與一般的線程一樣, 只需要在創建完之後調用如下函數即可:

setDaemon(true);

判斷

public final boolean isDaemon() {
    return daemon;
}

可以通過該函數判定一個線程是否為守護線程。

註意事項

函數setDaemon(true)必須在 start() 函數之前使用。

如 setDaemon(true) 在 start() 之後, 就會拋異常。如下

技術分享圖片

也就是說, 在線程運行之後, 其類型(守護與否)就已經確定了, 無法更改。

守護線程中產生的線程也是守護線程;

在 Thread 的 init() 函數中, 可以看到這麽一句:

this.daemon = parent.isDaemon();

測試

創建一個線程類

class PrimeThread extends Thread {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+" begin");
        try {
            int i = 0;
            while(true) {
                Thread.sleep(500);
                System.out.println("Current i = " + (i++));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+" end");
    }
}

創建測試方法

public static void main(String[] args) {
    PrimeThread primeThread = new PrimeThread();
    primeThread.setDaemon(true);
    primeThread.start();

    try {
        Thread.sleep(3000L);
        System.out.println("Main 函數準備結束了, 守護線程也機會停止, 不打印");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

結果如下:

技術分享圖片

結果中, Main 函數的線程結束後, primeThread 線程也隨之結束了。

Java 多線程(四)之守護線程(Daemon)