1. 程式人生 > >Thread 守護執行緒 Thread.setDaemon詳解

Thread 守護執行緒 Thread.setDaemon詳解

Thread 守護執行緒 Thread.setDaemon詳解

java中執行緒分為兩種型別:使用者執行緒守護執行緒。通過Thread.setDaemon(false)設定為使用者執行緒;通過Thread.setDaemon(true)設定為守護執行緒。如果不設定次屬性,預設為使用者執行緒。

 

使用者執行緒和守護執行緒的區別:

1. 主執行緒結束後用戶執行緒還會繼續執行,JVM存活;主執行緒結束後守護執行緒和JVM的狀態又下面第2條確定。

2.如果沒有使用者執行緒,都是守護執行緒,那麼JVM結束(隨之而來的是所有的一切煙消雲散,包括所有的守護執行緒)。

 

 

補充說明:

定義:守護執行緒--也稱“服務執行緒”,在沒有使用者執行緒可服務時會自動離開。

優先順序:守護執行緒的優先順序比較低,用於為系統中的其它物件和執行緒提供服務。

設定:通過setDaemon(true)來設定執行緒為“守護執行緒”;將一個使用者執行緒設定為守護執行緒的方式是線上程啟動用執行緒物件的setDaemon方法。

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

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

 

 

例子程式碼:

 

import java.io.IOException;
class TestMain4 extends Thread {
   public void run() {            //永真迴圈執行緒
       for(int i=0;;i++){
           try {
               Thread.sleep(1000);
           } catch (InterruptedException ex) {   }
           System.out.println(i);
       }
   }

   public static void main(String [] args){
      TestMain4 test = new TestMain4();
      test.setDaemon(true);    //除錯時可以設定為false,那麼這個程式是個死迴圈,沒有退出條件。設定為true,即可主執行緒結束,test執行緒也結束。
       test.start();
       System.out.println("isDaemon = " + test.isDaemon());
       try {
           System.in.read();   // 接受輸入,使程式在此停頓,一旦接收到使用者輸入,main執行緒結束,守護執行緒自動結束
       } catch (IOException ex) {}
   }
}