多線程一直是我們開發中最關注的一個點,因為在并發中,會有各種各樣的問題,但是這中多線程中的問題,又是我們需要去解決的,之前看書看到過一點内容,也和大家分享一下關于守護線程的一些知識。
什麼是守護線程
jAVA提供了兩種線程:守護線程和使用者線程,那麼什麼是守護線程呢?
守護線程又被稱之為“服務程序”, “精靈線程”或者是“背景線程”,是指在程式運作的時候在背景提供一種通用服務的線程。
這種線程并不屬于程式設計中不可或缺的部分。我們通俗一點說,任何一個守護線程都是整個JVM中所有的非守護線程的一個“保姆”。
使用者線程和守護線程幾乎是一樣的,唯一的不同之處就是在于如果說使用者線程已經全部退出了運作,隻剩下守護線程存在了,那麼JVM也就回相對應的退出了,因為當所有的非守線程結束的時候,沒有任何線程需要去被守護,那麼守護線程就沒工作可以繼續做了,那麼就說明程式是被終止了,這時候所有的守護線程都會被“殺死”。也就是說,隻要有任何一個非守護線程還處在運作當中的話,那麼守護線程就不會終止。
但是我們要注意一點,一個線程預設不是守護線程。我們可以用一個例子來證明一下:
請看下面的Demo
public class DaemonThreadTest extends Thread {
public static void main(String[] args) {
DaemonThreadTest daemonThreadTest = new DaemonThreadTest("背景線程");
System.out.println("是否是守護線程"+"---"+daemonThreadTest.isDaemon());
}
public DaemonThreadTest(String name){
super();
}
}

結果就像圖中所示的,一個線程不是守護線程。
但是在JAVA語言中,守護線程一般都具有的優先級都是比較低的,他并非是隻有JVM内部來提供的,使用者在編寫程式的時候也可以自己去設定守護
線程,例如,将一個使用者線程設定為守護線程的方法就是在調用start()方法的啟動線程之前調用對象的setDaemom(true)這個方法,
若将以上的參數設定為false的時候,則表示的是使用者程序模式,需要注意的是,當在一個守護線程中産生了其他的線程,那麼這些新産生的
線程預設會是守護線程,使用者線程也是如此,
我們看一下代碼執行個體
public class DaemonThreadTest2 extends Thread{ public void run(){ System.out.println(Thread.currentThread().getName()+":begain"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":end"); } } class Test{ public static void main(String[] args) { System.out.println("test1:begain"); DaemonThreadTest2 daemonThreadTest2 = new DaemonThreadTest2(); daemonThreadTest2.setDaemon(true); daemonThreadTest2.start(); System.out.println("test1:end"); } }
大家可以簡單的想一下結果是什麼?
結果其實是這樣的
從運作的記過中我們也可以發現,沒有輸出Thread-0:end,那麼為什麼結果會是這種樣子的呢?
其實就是在啟動線程前,我們将其設定為守護線程了,當程式中隻有守護線程存在的時候,JVM是可以退出的,
額就是說,當JVM中隻有守護線程運作的時候,JVM會自動關閉。
是以,當test1方法在調用的結束後,main線程将會退出,這時候線程daemonThreadTest2還處于休眠狀态沒有運作結束,但是這個時候隻有守護線程在
運作了,JVM關閉了,是以它就不會輸出“Thread-0:end”了。
守護線程的一個典型的例子就是垃圾回收器,隻要JVM啟動,他就會一直運作,實時的區監控可以被回收的資源。
是用守護線程要注意幾點:
- thread.setDaemon(true)必須在thread.start()之前設定,否則會跑出一個IllegalThreadStateException異常。你不能把正在運作的正常線程設定為守護線程。
- 在Daemon線程中産生的新線程也是Daemon的。
- 不要認為所有的應用都可以配置設定給Daemon來進行服務,比如讀寫操作或者計算邏輯。
以上就是我所介紹的守護線程,你了解了麼?
關注公衆号,大家可以在公衆号背景回複“部落格園”,免費獲得作者 Java 知識體系/面試必看資料。
Java 極客技術公衆号,是由一群熱愛 Java 開發的技術人組建成立,專注分享原創、高品質的 Java 文章。如果您覺得我們的文章還不錯,請幫忙贊賞、在看、轉發支援,鼓勵我們分享出更好的文章。