欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java高并發(fā)的用戶線程和守護(hù)線程詳解

 更新時間:2021年10月27日 10:18:38   作者:路人甲Java  
本篇文章主要介紹了淺談java中守護(hù)線程與用戶線程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

守護(hù)線程是一種特殊的線程,在后臺默默地完成一些系統(tǒng)性的服務(wù),比如垃圾回收線程、JIT線程都是守護(hù)線程。與之對應(yīng)的是用戶線程,用戶線程可以理解為是系統(tǒng)的工作線程,它會完成這個程序需要完成的業(yè)務(wù)操作。如果用戶線程全部結(jié)束了,意味著程序需要完成的業(yè)務(wù)操作已經(jīng)結(jié)束了,系統(tǒng)可以退出了。所以當(dāng)系統(tǒng)只剩下守護(hù)進(jìn)程的時候,java虛擬機(jī)會自動退出。

java線程分為用戶線程和守護(hù)線程,線程的daemon屬性為true表示是守護(hù)線程,false表示是用戶線程。

下面我們來看一下守護(hù)線程的一些特性。

程序只有守護(hù)線程時,系統(tǒng)會自動退出

package com.itsoku.chat03;	
/**	
 * 微信公眾號:路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請關(guān)注!	
 */	
public class Demo1 {	
    public static class T1 extends Thread {	
        public T1(String name) {	
            super(name);	
        }	
        @Override	
        public void run() {	
            System.out.println(this.getName() + "開始執(zhí)行," + (this.isDaemon() ? "我是守護(hù)線程" : "我是用戶線程"));	
            while (true) ;	
        }	
    }	
    public static void main(String[] args) {	
        T1 t1 = new T1("子線程1");	
        t1.start();	
        System.out.println("主線程結(jié)束");	
    }	
}

運(yùn)行上面代碼,結(jié)果如下:

640?wx_fmt=png

可以看到主線程已經(jīng)結(jié)束了,但是程序無法退出,原因:子線程1是用戶線程,內(nèi)部有個死循環(huán),一直處于運(yùn)行狀態(tài),無法結(jié)束。

再看下面的代碼:

package com.itsoku.chat03;	
/**	
 * 微信公眾號:路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請關(guān)注!	
 */	
public class Demo2 {	
    public static class T1 extends Thread {	
        public T1(String name) {	
            super(name);	
        }	
        @Override	
        public void run() {	
            System.out.println(this.getName() + "開始執(zhí)行," + (this.isDaemon() ? "我是守護(hù)線程" : "我是用戶線程"));	
            while (true) ;	
        }	
    }	
    public static void main(String[] args) {	
        T1 t1 = new T1("子線程1");	
        t1.setDaemon(true);	
        t1.start();	
        System.out.println("主線程結(jié)束");	
    }	
}

運(yùn)行結(jié)果:

640?wx_fmt=png

程序可以正常結(jié)束了,代碼中通過 t1.setDaemon(true); 將t1線程設(shè)置為守護(hù)線程,main方法所在的主線程執(zhí)行完畢之后,程序就退出了。

結(jié)論:當(dāng)程序中所有的用戶線程執(zhí)行完畢之后,不管守護(hù)線程是否結(jié)束,系統(tǒng)都會自動退出。

設(shè)置守護(hù)線程,需要在start()方法之前進(jìn)行

package com.itsoku.chat03;	
import java.util.concurrent.TimeUnit;	
/**	
 * 微信公眾號:路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請關(guān)注!	
 */	
public class Demo3 {	
    public static void main(String[] args) {	
        Thread t1 = new Thread() {	
            @Override	
            public void run() {	
                try {	
                    TimeUnit.SECONDS.sleep(10);	
                } catch (InterruptedException e) {	
                    e.printStackTrace();	
                }	
            }	
        };	
        t1.start();	
        t1.setDaemon(true);	
    }	
}

t1.setDaemon(true);是在t1的start()方法之后執(zhí)行的,執(zhí)行會報異常,運(yùn)行結(jié)果如下:

640?wx_fmt=png

線程daemon的默認(rèn)值

我們看一下創(chuàng)建線程源碼,位于Thread類的init()方法中:

Thread parent = currentThread();	
this.daemon = parent.isDaemon();

dameon的默認(rèn)值為為父線程的daemon,也就是說,父線程如果為用戶線程,子線程默認(rèn)也是用戶現(xiàn)場,父線程如果是守護(hù)線程,子線程默認(rèn)也是守護(hù)線程。

示例代碼:

package com.itsoku.chat03;	
import java.util.concurrent.TimeUnit;	
/**	
 * 微信公眾號:路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請關(guān)注!	
 */	
public class Demo4 {	
    public static class T1 extends Thread {	
        public T1(String name) {	
            super(name);	
        }	
        @Override	
        public void run() {	
            System.out.println(this.getName() + ".daemon:" + this.isDaemon());	
        }	
    }	
    public static void main(String[] args) throws InterruptedException {	
        System.out.println(Thread.currentThread().getName() + ".daemon:" + Thread.currentThread().isDaemon());	
        T1 t1 = new T1("t1");	
        t1.start();	
        Thread t2 = new Thread() {	
            @Override	
            public void run() {	
                System.out.println(this.getName() + ".daemon:" + this.isDaemon());	
                T1 t3 = new T1("t3");	
                t3.start();	
            }	
        };	
        t2.setName("t2");	
        t2.setDaemon(true);	
        t2.start();	
        TimeUnit.SECONDS.sleep(2);	
    }	
}

運(yùn)行代碼,輸出:

main.daemon:false
t1.daemon:false
t2.daemon:true
t3.daemon:true

t1是由主線程(main方法所在的線程)創(chuàng)建的,main線程是t1的父線程,所以t1.daemon為false,說明t1是用戶線程。

t2線程調(diào)用了 setDaemon(true);將其設(shè)為守護(hù)線程,t3是由t2創(chuàng)建的,所以t3默認(rèn)線程類型和t2一樣,t2.daemon為true。

總結(jié)

1.java中的線程分為用戶線程和守護(hù)線程

2.程序中的所有的用戶線程結(jié)束之后,不管守護(hù)線程處于什么狀態(tài),java虛擬機(jī)都會自動退出

3.調(diào)用線程的實例方法setDaemon()來設(shè)置線程是否是守護(hù)線程

4.setDaemon()方法必須在線程的start()方法之前調(diào)用,在后面調(diào)用會報異常,并且不起效

5.線程的daemon默認(rèn)值和其父線程一樣

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Spring Cloud Alibaba教程之Sentinel的使用

    Spring Cloud Alibaba教程之Sentinel的使用

    這篇文章主要介紹了Spring Cloud Alibaba教程之Sentinel的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • idea中的Maven導(dǎo)包失敗問題解決方案匯總

    idea中的Maven導(dǎo)包失敗問題解決方案匯總

    這篇文章主要介紹了idea中的Maven導(dǎo)包失敗問題解決總結(jié),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • Spring Boot如何通過java -jar啟動

    Spring Boot如何通過java -jar啟動

    大家開發(fā)的基于Spring Boot 的應(yīng)用 ,jar形式, 發(fā)布的時候,絕大部分都是使用java -jar 啟動。本文主要介紹了Spring Boot如何通過java -jar啟動,一起來了解一下
    2021-05-05
  • Java異常Exception詳細(xì)講解

    Java異常Exception詳細(xì)講解

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會根據(jù)身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機(jī)制是我們java語言使用異常處理機(jī)制為程序提供了錯誤處理的能力,程序出現(xiàn)的錯誤,程序可以安全的退出,以保證程序正常的運(yùn)行等
    2022-07-07
  • Java中MapStruct入門使用及對比

    Java中MapStruct入門使用及對比

    MapStruct是一個Java注解處理器框架,用于簡化Java Bean之間的映射,本文主要介紹了Java中MapStruct入門使用及對比,感興趣的可以了解一下
    2023-12-12
  • Java 迪杰斯特拉算法實現(xiàn)查找最短距離的實現(xiàn)

    Java 迪杰斯特拉算法實現(xiàn)查找最短距離的實現(xiàn)

    這篇文章主要介紹了Java 迪杰斯特拉算法實現(xiàn)查找最短距離的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • MyBatis利用攔截器實現(xiàn)數(shù)據(jù)脫敏詳解

    MyBatis利用攔截器實現(xiàn)數(shù)據(jù)脫敏詳解

    現(xiàn)代網(wǎng)絡(luò)環(huán)境中,敏感數(shù)據(jù)的處理是至關(guān)重要的,敏感數(shù)據(jù)包括個人身份信息、銀行賬號、手機(jī)號碼等,所以本文主要為大家詳細(xì)介紹了MyBatis如何利用攔截器實現(xiàn)數(shù)據(jù)脫敏,希望對大家有所幫助
    2023-11-11
  • Java dom4j生成與解析XML案例詳解

    Java dom4j生成與解析XML案例詳解

    這篇文章主要介紹了Java dom4j生成與解析XML案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • jdk線程池的實現(xiàn)

    jdk線程池的實現(xiàn)

    本文主要介紹了jdk線程池的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • spring中@ComponentScan自動掃描并指定掃描規(guī)則

    spring中@ComponentScan自動掃描并指定掃描規(guī)則

    本文主要介紹了spring中@ComponentScan自動掃描并指定掃描規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論