1. 程式人生 > >java中的守護執行緒

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 次執行