Java中用戶線程與守護線程(Daemon)

Java分爲兩種線程:用戶線程和守護線程

所謂守護線程是指在程序運行的時候在後臺提供一種通用服務的線程,比如垃圾回收線程就是一個很稱職的守護者,並且這種線程並不屬於程序中不可或缺的部分。因 此,當所有的非守護線程結束時,程序也就終止了,同時會殺死進程中的所有守護線程。反過來說,只要任何非守護線程還在運行,程序就不會終止。

將線程轉換爲守護線程可以通過調用Thread對象的setDaemon(true)方法來實現。在使用守護線程時需要注意一下幾點:

(1) thread.setDaemon(true)必須在thread.start()之前設置,否則會跑出一個IllegalThreadStateException異常。你不能把正在運行的常規線程設置爲守護線程。

(2) 在Daemon線程中產生的新線程也是Daemon的。

(3) 守護線程應該永遠不去訪問固有資源,如文件、數據庫,因爲它會在任何時候甚至在一個操作的中間發生中斷。


守護線程等待所有用戶線程結束後才結束。


Demo:

public class DaemonSample {
    static class DaemonThread extends Thread {
        public String name;
        public DaemonThread(String name){
            this.name = name;
        }
        @Override
        public void run() {
            for(int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(name+"i=" + i);
            }
        }
    }

    public static void main(String[] args) {
        Thread t1 = new DaemonThread("a");
        t1.setDaemon(true);
        Thread t2 = new DaemonThread("b");
        t1.start();
        t2.start();
    }
}

結果:

bi=0
ai=0
bi=1
ai=1
........
ai=8
bi=8
bi=9
ai=9

如果註釋掉 t2.start();

結果:


這是爲什麼呢,此時的用戶線程只有主線程了,主線程結束了,那麼守護線程肯定也隨之結束了,連執行的機會都沒有。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章