java學習Java程式設計:什麼是守護執行緒?

java妞妞發表於2016-05-17

Java提供了兩種執行緒:守護執行緒與使用者執行緒。


守護執行緒又被稱為服務程式、精靈執行緒、後臺執行緒,是指在程式執行時在後臺提供一種通用服務的執行緒,這種執行緒並不屬於程式中不可或缺的部分。通俗點講,任何一個守護執行緒都是整個JVM中所有非守護執行緒的 “保姆”。


使用者執行緒和守護執行緒幾乎一樣,唯一的不同之處就在於如果使用者執行緒已經全部退出執行,只剩下守護執行緒存在了,JVM也就退出了。因為當所有非守護執行緒結束時,沒有了被守護者, 守護執行緒沒有工作可做,也就沒有繼續執行程式的必要了,程式也就終止了,同時會 “殺死”所有守護執行緒。也就是說,只要有任何非守護執行緒還在執行,程式就不會終止。


在Java語言中,守護執行緒一般具有較低的優先順序,它並非只由JVM內部提供,使用者在編寫程式時也可以自己設定守護執行緒。例如,將一個使用者執行緒設定為守護執行緒的方法就是在呼叫 start()方法啟動執行緒之前呼叫物件的setDaemon(true)方法,若將以上引數設定為false,則表示是使用者程式模式。


需要注意的是,當在一個守護執行緒中產生了其他執行緒,那麼這些新產生的執行緒預設還是守護執行緒,使用者執行緒也是如此,示例如下:


class ThreadDemo extends Thread {

     public void run ( ) {

          System.out.println (Thread.currentThread( ).getName( ) + ":begin"); 

          try { Thread.sleep (1000); }

          catch (InterruptedException e) { e. printStackTrace ();}

          System. out. println (Thread. currentThread( ). getName( ) + " :end");

     }

}


public class Test {

     public static void main ( String [ ] args) {

           System. out. println("test:begin");

           Thread tl = new ThreadDemo();

           tl. setDaemon(true);

           tl. start();

          System. out. println( " test:end");

}


程式執行結果為:

test:begin

test:end

Thread - 0:begin


從執行結果中可以發現,沒有輸出“Thread-0:end”。之所以結果是這樣,是在啟動執行緒前將其設定為守護執行緒了,當程式中只有守護執行緒存在時,JVM是可以退出的,也就是說,當 JVM中只有守護執行緒執行時,JVM會自動關閉。因此,當test方法呼叫結束後,main執行緒將退出,此時執行緒tl還處於休眠狀態沒有執行結束,但是由於此時只有這個守護執行緒在執行, JVM將會關閉,因此不會輸出“Thread - 0:end”。


守護執行緒的一個典型的例子就是垃圾回收器。只要JVM啟動,它始終在執行,實時監控和管理系統中可以被回收的資源。


對於學習有困難不知道怎麼去做的可以加扣:578024144進行交流同時得到大神的指導和幫助,獲取免費的聽課許可權!!!

相關文章