運行結果: 結論:非守護線程結束之後jvm退出,守護線程沒有要守護的線程,也進行退出 守護線程和用戶線程唯一的區別在於: 補充說明: 定義:守護線程--也稱“服務線程”,在沒有用戶線程可服務時會自動離開。 優先順序:守護線程的優先順序比較低,用於為系統中的其它對象和線程提供服務。 設置:通過setDae ...
1 package com.cn.test.thread; 2 3 /** 4 * 守護線程:任何一個守護線程都是整個JVM中所有非守護線程的保姆:只要當前JVM實例中尚存在任何一個非守護線程沒有結束, 5 * 守護線程就全部工作;只有當最後一個非守護線程結束時,守護線程隨著JVM一同結束工作。 GC線程 6 * @author Administrator 7 *用戶線程:用戶自定義的線程 8 *JVM會在所有的非守護線程(用戶線程)執行完畢後退出; 9 main線程是用戶線程; 10 僅有main線程一個用戶線程執行完畢,不能決定JVM是否退出,也即是說main線程並不一定是最後一個退出的線程。 11 */ 12 public class TestDaemon { 13 14 public static void main(String[] args) { 15 16 //fase main線程不是守護線程 17 System.out.println(Thread.currentThread().isDaemon()); 18 for (int i=0; i <3; i++) { 19 System.out.println("非守護線程正在執行" + i); 20 } 21 TestThread1 t1 = new TestThread1(); 22 t1.setDaemon(true); 23 t1.start(); 24 } 25 26 } 27 28 class TestThread1 extends Thread { 29 @Override 30 public void run() { 31 for (int i=0; i<10;i++) { 32 try { 33 Thread.sleep(10); 34 } catch (InterruptedException e) { 35 // TODO Auto-generated catch block 36 e.printStackTrace(); 37 } 38 System.out.println("守護線程正在執行" + i); 39 } 40 } 41 }
運行結果:
false 非守護線程正在執行0 非守護線程正在執行1 非守護線程正在執行2
結論:非守護線程結束之後jvm退出,守護線程沒有要守護的線程,也進行退出
守護線程和用戶線程唯一的區別在於:
補充說明: 定義:守護線程--也稱“服務線程”,在沒有用戶線程可服務時會自動離開。 優先順序:守護線程的優先順序比較低,用於為系統中的其它對象和線程提供服務。 設置:通過setDaemon(true)來設置線程為“守護線程”;將一個用戶線程設置為 守護線程的方式是在 線程對象創建 之前 用線程對象的setDaemon方法。 example: 垃圾回收線程就是一個經典的守護線程,當我們的程式中不再有任何運行的 Thread,程式就不會再產生垃圾,垃圾回收器也就無事可做,所以當垃圾回收線程是 JVM上僅剩的線程時,垃圾回收線程會自動離開。它始終在低級別的狀態中運行,用於 實時監控和管理系統中的可回收資源。 生命周期:守護進程(Daemon)是運行在後臺的一種特殊進程。它獨立於控制終端並且 周期性地執行某種任務或等待處理某些發生的事件。也就是 說守護線程不依賴於終端,但是依賴於系統,與系統“同生共死”。那Java的守護線程是 什麼樣子的呢。當JVM中所有的線程都是守護線程的時候,JVM就可以退出了;如果還有一個 或以上的非守護線程則JVM不會退出。