最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java守護線程和用戶線程的區(qū)別

 更新時間:2022年05月11日 17:23:56   作者:??Java中文社群????  
這篇文章主要介紹了Java守護線程和用戶線程的區(qū)別,用戶線程和守護線程,默認情況下我們創(chuàng)建的線程或線程池都是用戶線程,所以用戶線程也被稱之為普通線程,下文更多詳細內(nèi)容需要的小伙伴可以參考一下

前言:

在 Java 語言中,線程分為兩類:用戶線程和守護線程,默認情況下我們創(chuàng)建的線程或線程池都是用戶線程,所以用戶線程也被稱之為普通線程。

想要查看線程到底是用戶線程還是守護線程,可以通過 Thread.isDaemon() 方法來判斷,如果返回的結(jié)果是 true 則為守護線程,反之則為用戶線程。

我們來測試一下默認情況下線程和線程池屬于哪種線程類型?測試代碼如下:

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 線程類型:守護線程 OR 用戶線程
 */
public class ThreadType {
    public static void main(String[] args) {
        // 創(chuàng)建線程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                //...
            }
        });
        // 創(chuàng)建線程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10,
                0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100));
        threadPool.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("ThreadPool 線程類型:" +
                        (Thread.currentThread().isDaemon() == true ? "守護線程" : "用戶線程"));
            }
        });
        System.out.println("Thread 線程類型:" +
                (thread.isDaemon() == true ? "守護線程" : "用戶線程"));
        System.out.println("main 線程類型:" +
                (Thread.currentThread().isDaemon() == true ? "守護線程" : "用戶線程"));
    }
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

從上述結(jié)果可以看出,默認情況下創(chuàng)建的線程和線程池都是用戶線程。

守護線程定義

守護線程(Daemon Thread)也被稱之為后臺線程或服務(wù)線程,守護線程是為用戶線程服務(wù)的,當(dāng)程序中的用戶線程全部執(zhí)行結(jié)束之后,守護線程也會跟隨結(jié)束。 守護線程的角色就像“服務(wù)員”,而用戶線程的角色就像“顧客”,當(dāng)“顧客”全部走了之后(全部執(zhí)行結(jié)束),那“服務(wù)員”(守護線程)也就沒有了存在的意義,所以當(dāng)一個程序中的全部用戶線程都結(jié)束執(zhí)行之后,那么無論守護線程是否還在工作都會隨著用戶線程一塊結(jié)束,整個程序也會隨之結(jié)束運行。

創(chuàng)建守護線程

我們可以通過 Thread.setDaemon(true) 方法將線程設(shè)置為守護線程,比如以下代碼的實現(xiàn):

public static void main(String[] args) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            //...
        }
    });
    // 設(shè)置線程為守護線程
    thread.setDaemon(true);
    System.out.println("Thread 線程類型:" +
                       (thread.isDaemon() == true ? "守護線程" : "用戶線程"));
    System.out.println("main 線程類型:" +
                       (Thread.currentThread().isDaemon() == true ? "守護線程" : "用戶線程"));
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

將線程池設(shè)置為守護線程

要把線程池設(shè)置為守護線程相對來說麻煩一些,需要將線程池中的所有線程都設(shè)置成守護線程,這個時候就需要使用線程工廠 ThreadFactory 來設(shè)置了(線程池中的所有線程都是通過線程工廠創(chuàng)建的),

它的具體實現(xiàn)代碼如下:

public static void main(String[] args) throws InterruptedException {
    // 線程工廠(設(shè)置守護線程)
    ThreadFactory threadFactory = new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r);
            // 設(shè)置為守護線程
            thread.setDaemon(true);
            return thread;
        }
    };
    // 創(chuàng)建線程池
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10,
                                                           0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), threadFactory);
    threadPool.submit(new Runnable() {
        @Override
        public void run() {
            System.out.println("ThreadPool 線程類型:" +
                               (Thread.currentThread().isDaemon() == true ? "守護線程" : "用戶線程"));
        }
    });
    Thread.sleep(2000);
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

守護線程 VS 用戶線程

通過前面的內(nèi)容我們了解了什么是用戶線程和守護線程了,那二者有什么區(qū)別呢?接下來我們用一個小示例來觀察一下。 接下來我們將創(chuàng)建一個線程,分別將這個線程設(shè)置為用戶線程和守護線程,在每個線程中執(zhí)行一個 for 循環(huán),總共執(zhí)行 10 次信息打印,每次打印之后休眠 100 毫秒,來觀察程序的運行結(jié)果。

用戶線程

新建的線程默認就是用戶線程,因此我們無需對線程進行任何特殊的處理,執(zhí)行 for 循環(huán)即可(總共執(zhí)行 10 次信息打印,每次打印之后休眠 100 毫秒),

實現(xiàn)代碼如下:

public static void main(String[] args) throws InterruptedException {
    // 創(chuàng)建用戶線程
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i <= 10; i++) {
                // 打印 i 信息
                System.out.println("i:" + i);
                try {
                    // 休眠 100 毫秒
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    // 啟動線程
    thread.start();
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

 從上述結(jié)果可以看出,當(dāng)程序執(zhí)行完 10 次打印之后才會正常結(jié)束進程。

守護線程

public static void main(String[] args) throws InterruptedException {
    // 創(chuàng)建守護線程
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i <= 10; i++) {
                // 打印 i 信息
                System.out.println("i:" + i);
                try {
                    // 休眠 100 毫秒
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    // 設(shè)置為守護線程
    thread.setDaemon(true);
    // 啟動線程
    thread.start();
}

以上程序執(zhí)行結(jié)果如下圖所示: 

 從上述結(jié)果可以看出,當(dāng)線程設(shè)置為守護線程之后,整個程序不會等守護線程 for 循環(huán) 10 次之后再進行關(guān)閉,而是當(dāng)主線程結(jié)束之后,守護線程一次循環(huán)都沒執(zhí)行就結(jié)束了,由此可以看出守護線程和用戶線程的不同。

守護線程注意事項

守護線程的設(shè)置 setDaemon(true) 必須要放在線程的 start() 之前,否則程序會報錯。也就是說在運行線程之前,一定要先確定線程的類型,并且線程運行之后是不允許修改線程的類型的。 接下來我們來演示一下,如果在程序運行執(zhí)行再設(shè)置線程的類型會出現(xiàn)什么問題?

演示代碼如下:

public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i <= 10; i++) {
                // 打印 i 信息
                System.out.println("i:" + i + ",isDaemon:" +
                            Thread.currentThread().isDaemon());
                try {
                    // 休眠 100 毫秒
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    // 啟動線程
    thread.start();
    // 設(shè)置為守護線程
    thread.setDaemon(true);
}

以上程序執(zhí)行結(jié)果如下圖所示: 

 從上述結(jié)果可以看出,當(dāng)我們將 setDaemon(true) 設(shè)置在 start() 之后,不但程序的執(zhí)行會報錯,而且設(shè)置的守護線程也不會生效。

總結(jié)

在 Java 語言中線程分為兩類:用戶線程和守護線程,默認情況下我們創(chuàng)建的線程或線程池都是用戶線程,守護線程是為用戶線程服務(wù)的,當(dāng)一個程序中的所有用戶線程都執(zhí)行完成之后程序就會結(jié)束運行,程序結(jié)束運行時不會管守護線程是否正在運行,由此我們可以看出守護線程在 Java 體系中權(quán)重是比較低的,這就是守護線程和用戶線程的區(qū)別。

到此這篇關(guān)于Java守護線程和用戶線程的區(qū)別的文章就介紹到這了,更多相關(guān)Java 守護線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot自動配置實現(xiàn)的詳細步驟

    SpringBoot自動配置實現(xiàn)的詳細步驟

    這篇文章主要為大家介紹了SpringBoot自動配置實現(xiàn)詳細的過程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java中的LinkedList底層源碼分析

    Java中的LinkedList底層源碼分析

    這篇文章主要介紹了Java中的LinkedList底層源碼分析,底層基于雙向鏈表,往LinkedList中間插入元素時,不需要移動大量的元素,只需要修改前后節(jié)點的指針,速度快,需要的朋友可以參考下
    2023-12-12
  • Java之遍歷枚舉值問題

    Java之遍歷枚舉值問題

    這篇文章主要介紹了Java之遍歷枚舉值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java實現(xiàn)文件的斷點續(xù)傳

    java實現(xiàn)文件的斷點續(xù)傳

    這篇文章主要為大家詳細介紹了java實現(xiàn)文件的斷點續(xù)傳,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 通過springboot+mybatis+druid配置動態(tài)數(shù)據(jù)源

    通過springboot+mybatis+druid配置動態(tài)數(shù)據(jù)源

    這篇文章主要介紹了通過springboot+mybatis+druid配置動態(tài)數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • SpringBoot中使用Servlet的兩種方式小結(jié)

    SpringBoot中使用Servlet的兩種方式小結(jié)

    這篇文章主要介紹了SpringBoot中使用Servlet的兩種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java Kubernetes本地部署的實現(xiàn)示例

    Java Kubernetes本地部署的實現(xiàn)示例

    本文,主要介紹了Java Kubernetes本地部署的實現(xiàn),示例文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-10-10
  • SpringBoot2使用WebFlux函數(shù)式編程的方法

    SpringBoot2使用WebFlux函數(shù)式編程的方法

    這篇文章主要介紹了SpringBoot2使用WebFlux函數(shù)式編程的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • SpringBoot yml配置敏感信息加密的實現(xiàn)

    SpringBoot yml配置敏感信息加密的實現(xiàn)

    本文主要介紹了SpringBoot yml配置敏感信息加密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • 淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用

    淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用

    這篇文章主要介紹了淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用,幫助大家更好的理解和使用spirngboot框架,感興趣的朋友可以了解下
    2021-01-01

最新評論

汉沽区| 乌兰浩特市| 邻水| 滕州市| 嵩明县| 巫溪县| 丰城市| 海口市| 霍林郭勒市| 凤山市| 赣州市| 鲁甸县| 阿拉善右旗| 广丰县| 贵定县| 栾城县| 德清县| 鸡东县| 治县。| 新化县| 盐源县| 杂多县| 阳原县| 武安市| 江都市| 芷江| 河津市| 上虞市| 开鲁县| 西乌| 北辰区| 进贤县| 林芝县| 榆中县| 桦南县| 西乌珠穆沁旗| 宿松县| 莎车县| 开封市| 固阳县| 安仁县|