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

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

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

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

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

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

程序只有守護(hù)線程時(shí),系統(tǒng)會(huì)自動(dòng)退出

package com.itsoku.chat03;	
/**	
 * 微信公眾號(hào):路人甲Java,專(zhuān)注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲(chóng)、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫(kù)分表、大數(shù)據(jù)等),喜歡請(qǐng)關(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() + "開(kāi)始執(zhí)行," + (this.isDaemon() ? "我是守護(hù)線程" : "我是用戶(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é)束了,但是程序無(wú)法退出,原因:子線程1是用戶(hù)線程,內(nèi)部有個(gè)死循環(huán),一直處于運(yùn)行狀態(tài),無(wú)法結(jié)束。

再看下面的代碼:

package com.itsoku.chat03;	
/**	
 * 微信公眾號(hào):路人甲Java,專(zhuān)注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲(chóng)、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫(kù)分表、大數(shù)據(jù)等),喜歡請(qǐng)關(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() + "開(kāi)始執(zhí)行," + (this.isDaemon() ? "我是守護(hù)線程" : "我是用戶(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é)束了,代碼中通過(guò) t1.setDaemon(true); 將t1線程設(shè)置為守護(hù)線程,main方法所在的主線程執(zhí)行完畢之后,程序就退出了。

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

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

package com.itsoku.chat03;	
import java.util.concurrent.TimeUnit;	
/**	
 * 微信公眾號(hào):路人甲Java,專(zhuān)注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲(chóng)、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫(kù)分表、大數(shù)據(jù)等),喜歡請(qǐng)關(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í)行會(huì)報(bào)異常,運(yùn)行結(jié)果如下:

640?wx_fmt=png

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

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

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

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

示例代碼:

package com.itsoku.chat03;	
import java.util.concurrent.TimeUnit;	
/**	
 * 微信公眾號(hào):路人甲Java,專(zhuān)注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲(chóng)、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫(kù)分表、大數(shù)據(jù)等),喜歡請(qǐng)關(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,說(shuō)明t1是用戶(hù)線程。

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

總結(jié)

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

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

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

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

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

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

相關(guān)文章

  • Java自定義映射resultMap定義及用法

    Java自定義映射resultMap定義及用法

    MyBatis的每一個(gè)查詢(xún)映射的返回類(lèi)型都是ResultMap,當(dāng)我們提供返回類(lèi)型屬性是resultType時(shí),MyBatis會(huì)自動(dòng)給我們把對(duì)應(yīng)值賦給resultType所指定對(duì)象的屬性,當(dāng)我們提供返回類(lèi)型是resultMap時(shí),將數(shù)據(jù)庫(kù)中列數(shù)據(jù)復(fù)制到對(duì)象的相應(yīng)屬性上,可以用于復(fù)制查詢(xún),兩者不能同時(shí)用
    2022-11-11
  • SpringBoot+Thymeleaf+ECharts實(shí)現(xiàn)大數(shù)據(jù)可視化(基礎(chǔ)篇)

    SpringBoot+Thymeleaf+ECharts實(shí)現(xiàn)大數(shù)據(jù)可視化(基礎(chǔ)篇)

    本文主要介紹了SpringBoot+Thymeleaf+ECharts實(shí)現(xiàn)大數(shù)據(jù)可視化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06
  • Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室實(shí)例

    Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室實(shí)例

    這篇文章主要介紹了Java基于socket實(shí)現(xiàn)簡(jiǎn)易聊天室的方法,實(shí)例分析了java基于socket實(shí)現(xiàn)聊天室服務(wù)端與客戶(hù)端的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Mybatis基于注解實(shí)現(xiàn)多表查詢(xún)功能

    Mybatis基于注解實(shí)現(xiàn)多表查詢(xún)功能

    這篇文章主要介紹了Mybatis基于注解實(shí)現(xiàn)多表查詢(xún)功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Windows下將JAVA?jar注冊(cè)成windows服務(wù)的方法

    Windows下將JAVA?jar注冊(cè)成windows服務(wù)的方法

    這篇文章主要介紹了Windows下將JAVA?jar注冊(cè)成windows服務(wù)的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • SpringBoot整合MyBatis四種常用的分頁(yè)方式(詳細(xì)總結(jié))

    SpringBoot整合MyBatis四種常用的分頁(yè)方式(詳細(xì)總結(jié))

    這篇文章詳細(xì)給大家總結(jié)了SpringBoot整合MyBatis四種常用的分頁(yè)方式,文中通過(guò)代碼示例為大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • SpringBoot中使用AOP實(shí)現(xiàn)日志記錄功能

    SpringBoot中使用AOP實(shí)現(xiàn)日志記錄功能

    AOP的全稱(chēng)是Aspect-Oriented Programming,即面向切面編程(也稱(chēng)面向方面編程),它是面向?qū)ο缶幊蹋∣OP)的一種補(bǔ)充,目前已成為一種比較成熟的編程方式,本文給大家介紹了SpringBoot中使用AOP實(shí)現(xiàn)日志記錄功能,需要的朋友可以參考下
    2024-05-05
  • 使用Hibernate根據(jù)實(shí)體類(lèi)自動(dòng)生成表的方法

    使用Hibernate根據(jù)實(shí)體類(lèi)自動(dòng)生成表的方法

    這篇文章主要介紹了使用Hibernate根據(jù)實(shí)體類(lèi)自動(dòng)生成表的方法,該篇提供了兩種方法,可以根據(jù)需要選擇其一,希望對(duì)你有所幫助,如有不對(duì)的地方還望指正
    2023-03-03
  • Java實(shí)現(xiàn)ATM系統(tǒng)超全面步驟解讀建議收藏

    Java實(shí)現(xiàn)ATM系統(tǒng)超全面步驟解讀建議收藏

    這篇文章主要為大家詳細(xì)介紹了用Java實(shí)現(xiàn)簡(jiǎn)單ATM機(jī)功能,文中實(shí)現(xiàn)流程寫(xiě)的非常清晰全面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java去除字符串空格的幾種方法簡(jiǎn)單舉例

    Java去除字符串空格的幾種方法簡(jiǎn)單舉例

    在Java中要去掉字符串中的空格,可以使用多種方法,這篇文章主要給大家介紹了關(guān)于Java去除字符串空格的幾種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12

最新評(píng)論

卢氏县| 乐昌市| 通许县| 德江县| 阿图什市| 洛宁县| 高青县| 札达县| 新竹县| 盘锦市| 万载县| 沂南县| 长沙市| 壤塘县| 汝南县| 商都县| 通渭县| 泽库县| 莎车县| 略阳县| 荃湾区| 宕昌县| 吉安市| 桦川县| 井陉县| 阳春市| 三门峡市| 门头沟区| 阳山县| 体育| 旌德县| 渭南市| 溧阳市| 班戈县| 璧山县| 肥东县| 习水县| 馆陶县| 江口县| 哈巴河县| 东光县|