詳解Java中的守護線程

線程分類

守護線程(即daemon thread),是個服務線程,準確地來說就是服務其他的線程,這是它的作用——而其他的線程只有一種,那就是用戶線程。所以java裏線程分2種:

  • 用戶線程:比如垃圾回收線程,就是最典型的守護線程
  • 守護線程:就是應用程序裏的自定義線程

用戶線程舉例

public class UserTest {
    public static void main(String[] args) {
        Thread daemonThread = new Thread(new Runnable() {
            @Override
                        public void run() {
                while (true) {
                    System.out.println("hi daemon....");
                }
            }
        }
        );
        daemonThread.start();
        try {
            Thread.sleep(1);
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main thread is over!");
    }
}

守護線程舉例

public class DaemonTest {
    public static void main(String[] args) {
        Thread daemonThread = new Thread(new Runnable() {
            @Override
                        public void run() {
                while(true) {
                    System.out.println("hi Daemon....");
                }
            }
        }
        );
        daemonThread.setDaemon(true);
        daemonThread.start();
        try {
            Thread.sleep(1);
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main thread is over!");
    }
}

結果對比

用戶線程中會一直執行下去,守護線程執行一會就結束了。

定義

  1. 守護線程,專門用於服務其他的線程,如果其他的線程(即用戶自定義線程)都執行完畢,連main線程也執行完畢,那麼jvm就會退出(即停止運行)——此時,連jvm都停止運行了,守護線程當然也就停止執行了。

  2. 再換一種說法,如果有用戶自定義線程存在的話,jvm就不會退出——此時,守護線程也不能退出,也就是它還要運行,幹嘛呢,就是爲了執行垃圾回收的任務啊。

守護進程和用戶進程同時執行任務的例子

public class MyCommon extends Thread {
    public void run() {
        for (int i = 0; i < 5; ++i) {
            System.out.println("線程1第 " + i + " 次執行");
            try {
                Thread.sleep(7);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class MyDaemon extends Thread {
    public void run() {
        for (int i = 0; i < 5000; ++i) {
            System.out.println("後臺線程1第 " + i + " 次執行");
            try {
                Thread.sleep(7);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        Thread thread1 = new MyCommon();
        Thread thread2 = new MyDaemon();
        thread2.setDaemon(true);
        thread1.start();
        thread2.start();
    }
}

執行結果

後臺線程1第 0 次執行
線程1第 0 次執行
後臺線程1第 1 次執行
線程1第 1 次執行
後臺線程1第 2 次執行
線程1第 2 次執行
後臺線程1第 3 次執行
線程1第 3 次執行
後臺線程1第 4 次執行
線程1第 4 次執行
後臺線程1第 5 次執行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章