守護線程:為所有非守護線程提供服務的線程;換句話說,任何一個守護線程都是整個JVM中所有非守護線程的保姆;
代碼演示
守護線程通過調用接口實現設置,java.lang.Thread#setDaemon(boolean on),參數boolean類型,true則是守護線程,false則不是守護線程;
public static void main(String[] arg0) { System.out.println("main start====="); Thread thread1 = new Thread("守護線程"){ @Override public void run() { int i = 0; while (i <= 4){ i++; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+i); } super.run(); } }; Thread thread2 = new Thread("用戶線程"){ @Override public void run() { int i = 0; while (i <= 2){ i++; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+i); } super.run(); } }; //setDaemon, 不設置則默認false thread1.setDaemon(true);//設置thread1為守護線程 thread2.setDaemon(false);//設置thread2為普通線程 thread1.start(); thread2.start(); System.out.println("main end=="); }
執行結果
main start===== main end== 用戶線程:1 守護線程:1 守護線程:2 用戶線程:2 守護線程:3 用戶線程:3
從運行結果可以看出:
主線程,main執行結束后,普通線程可以繼續執行直至執行完畢;
用戶線程執行完畢后,守護線程立刻結束;
結論
守護線程類似於整個進程的一個默默無聞的小嘍嘍;它的生死無關重要,它卻依賴整個進程而運行;哪天其他線程結束了,沒有要執行的了,程序就結束了,理都沒理守護線程,就把它中斷了;
如果守護線程自己識時務,自己早點執行完畢,那就自己早點結束;整個程序也不必因此而挽留它;
守護線程就是一個暗戀女神的備胎
注意: 由於守護線程的終止是自身無法控制的,因此千萬不要把IO、File等重要操作邏輯分配給它;因為它不靠譜;
那么守護線程的作用是什么?
舉例, GC垃圾回收線程:就是一個經典的守護線程,當我們的程序中不再有任何運行的Thread,程序就不會再產生垃圾,垃圾回收器也就無事可做,所以當垃圾回收線程是JVM上僅剩的線程時,垃圾回收線程會自動離開。它始終在低級別的狀態中運行,用於實時監控和管理系統中的可回收資源。
應用場景:(1)來為其它線程提供服務支持的情況;(2) 或者在任何情況下,程序結束時,這個線程必須正常且立刻關閉,就可以作為守護線程來使用;反之,如果一個正在執行某個操作的線程必須要正確地關閉掉否則就會出現不好的后果的話,那么這個線程就不能是守護線程,而是用戶線程。通常都是些關鍵的事務,比方說,數據庫錄入或者更新,這些操作都是不能中斷的。
————————————————
當主線程結束時,結束其余的子線程(守護線程)自動關閉,就免去了還要繼續關閉子線程的麻煩。如:Java垃圾回收線程就是一個典型的守護線程;內存資源或者線程的管理,但是非守護線程也可以。
原文鏈接:https://blog.csdn.net/weixin_40087231/article/details/90031253