守護線程和非守護線程


直覺上來講,守護線程和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主線程、用戶線程都掛掉時候,守護線程也會退出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM