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

java的Daemon守護執行緒

linux下:
守護(Daemon)程序,是Linux中的後臺服務程序。它是一個生存期較長的程序,通常獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。

守護執行緒在沒有使用者執行緒可服務時自動離開,在Java中比較特殊的執行緒是被稱為守護(Daemon)執行緒的低級別執行緒。 這個執行緒具有最低的優先順序,用於為系統中的其它物件和執行緒提供服務。將一個使用者執行緒設定為守護執行緒的方式是線上程物件建立之前呼叫執行緒物件的setDaemon方法。

典型例子:
JVM中的系統資源自動回收執行緒,我們所熟悉的Java垃圾回收執行緒就是一個典型的守護執行緒, 當我們的程式中不再有任何執行中的Thread,程式就不會再產生垃圾,垃圾回收器也就無事可做,所以當垃圾回收執行緒是Java虛擬機器上僅剩的執行緒時,Java虛擬機器會自動離開。 它始終在低級別的狀態中執行,用於實時監控和管理系統中的可回收資源。

最通俗的說法:

守護程序(Daemon)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。 
也就是說守護執行緒不依賴於終端,但是依賴於系統,與系統“同生共死”。 
那Java的守護執行緒是什麼樣子的呢。當JVM中所有的執行緒都是守護執行緒的時候,JVM就可以退出了;

守護執行緒需要注意點:
(1)thread.setDaemon(true)必須在thread.start()之前設定,否則會跑出一個IllegalThreadStateException異常。你不能把正在執行的常規執行緒設定為守護執行緒。
(2)在Daemon執行緒中產生的新執行緒也是Daemon的。
(3)不要認為所有的應用都可以分配給Daemon來進行服務,比如讀寫操作或者計算邏輯。 (不能保證,當用戶程序都退出了,守護程序的 讀寫任務是否完成,即使沒有完成,守護程序也會自動退出)
上面內容地址:

https://www.cnblogs.com/NeilZhang/p/7087399.html

原始碼實戰


public class Test {
    public static void main(String[] args) {
        Thread t1 = new MyCommon();
        Thread t2 = new MyDaemon();

        t2.setDaemon(true);
        t2.start();
        t1.start();

    }

}
class MyCommon extends Thread {

    @Override
    public
void run() { for (int i = 0; i < 5; i++) { System.out.println("執行緒1第"+i+"次執行!"); /*try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); }*/ } } } class MyDaemon extends Thread { @Override public void run() { for (int i = 0; i < 9999999L; i++) { System.out.println("守護執行緒===第"+i+"次執行!"); /*try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); }*/ } } }

上面原始碼說明

1.最開始MyCommon 、MyDaemon 都是main中的一個執行緒
2.MyDaemon 設定了守護執行緒
3.也就是main方法跑完,就意味應用程式結束,而守護執行緒MyDaemon 的物件也會結束
4.而main方法跑完就取決於MyCommon 跑完,如果main中的程式或者分支沒有跑完,MyDaemon的守護執行緒是不會結束,而是一直存在jvm。假設如果for (int i = 0; i < 9999999L; i++) {中的9999999L變成3或者其他數字也是一樣的。無非是沒有什麼東西列印顯示而已。