直覺上來講,守護線程和main相關
Java中有兩種線程,一種是用戶線程,另一種是守護線程。
用戶線程是指用戶自定義創建的線程,主線程停止,用戶線程不會停止(另一條執行路徑)
守護線程當進程不存在或主線程停止,守護線程也會被停止。
我們自己創建的線程叫 用戶線程 如果主線程停止掉 不會影響用戶線程(非守護線程)
Java中 不光有主線程還有GC線程
主線程銷毀之后 GC線程也跟着一起銷毀
用戶線程和守護線程的適用場景
由兩者的區別及dead時間點可知,守護線程不適合用於輸入輸出或計算等操作,因為用戶線程執行完畢,程序就dead了,適用於輔助用戶線程的場景,如JVM的垃圾回收,內存管理都是守護線程,還有就是在做數據庫應用的時候,使用的數據庫連接池,連接池本身也包含着很多后台線程,監聽連接個數、超時時間、狀態等。
主線程死掉后 就不需要回收垃圾了 主程序死掉了 進程掛了都 gc線程主要回收主線程里面的 有專門回收子線程垃圾的線程
守護線程和用戶線程的沒啥本質的區別:唯一的不同之處就在於虛擬機的離開:如果用戶線程已經全部退出運行了,只剩下守護線程存在了,虛擬機也就退出了。 因為沒有了被守護者,守護線程也就沒有工作可做了,也就沒有繼續運行程序的必要了。
總結:沒有啥子線程時候,守護線程會被殺死,會退出
我總結了個小demo,大家可以跑一跑,就是個排列組合,大家看看怎么回事兒
主線程 守護線程 用戶線程
三個 排列組合
看看效果
package com.toov5.thread; public class DaemonThread { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run() { while (true) { try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("守護子線程"); } } } ); thread.setDaemon(true); thread.start(); // // new Thread(new Runnable() { // public void run() { // while (true) { // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println("非守護子線程1"); // } // } // } ).start(); new Thread(new Runnable() { public void run() { for (int i=0;i<100;i++) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("非守護子線程2"); } } } ).start(); for(int i=0; i<10;i++){ try { Thread.sleep(100); } catch (Exception e) { // TODO: handle exception } // System.out.println("主線程"); } System.out.println("主線程執行完畢!!!!!!!!!!!!!!!!"); } }
大家看看輸出結果就明了了
總結: jvm主線程、用戶線程都掛掉時候,守護線程也會退出。