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

淺談java中守護(hù)線程與用戶線程

 更新時(shí)間:2017年09月29日 15:04:19   作者:今天你不奮斗明天你就落后  
本篇文章主要介紹了淺談java中守護(hù)線程與用戶線程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Java線程分為兩類分別為daemon線程(守護(hù)線程)和User線程(用戶線程),在JVM啟動(dòng)時(shí)候會(huì)調(diào)用main函數(shù),main函數(shù)所在的線程是一個(gè)用戶線程,這個(gè)是我們可以看到的線程,其實(shí)JVM內(nèi)部同時(shí)還啟動(dòng)了好多守護(hù)線程,比如垃圾回收線程。那么守護(hù)線程和用戶線程有什么區(qū)別那?區(qū)別之一是當(dāng)最后一個(gè)非守護(hù)線程結(jié)束時(shí)候,JVM會(huì)正常退出,而不管當(dāng)前是否有守護(hù)線程,也就是說(shuō)守護(hù)線程是否結(jié)束并不影響JVM的退出。言外之意是只要有一個(gè)用戶線程還沒(méi)結(jié)束正常情況下JVM就不會(huì)退出。

那么Java中如何創(chuàng)建一個(gè)守護(hù)線程那?代碼如下:

public static void main(String[] args) {

    Thread daemonThread = new Thread(new Runnable() {
      public void run() {
        
      }
    });
    
    //設(shè)置為守護(hù)線程
    daemonThread.setDaemon(true);
    daemonThread.start();
    
  } 

可知只需要設(shè)置線程的daemon參數(shù)為true即可。

下面通過(guò)例子來(lái)加深用戶線程與守護(hù)線程的區(qū)別的理解,首先看下面代碼:

public static void main(String[] args) {

    Thread thread = new Thread(new Runnable() {
      public void run() {
        for(;;){}
      }
    });
    
    //啟動(dòng)子線
    thread.start();
    
    System.out.print("main thread is over");
  }

結(jié)果輸出為:


如上代碼在main線程中創(chuàng)建了一個(gè)thread線程,thread線程里面是無(wú)限循環(huán),運(yùn)行代碼從結(jié)果看main線程已經(jīng)運(yùn)行結(jié)束了,那么JVM進(jìn)行已經(jīng)退出了?從IDE的輸出結(jié)果右側(cè)上的紅色方塊說(shuō)明JVM進(jìn)程并沒(méi)有退出,另外
mac上執(zhí)行ps -eaf | grep java會(huì)輸出結(jié)果,也可以證明這個(gè)結(jié)論。

這個(gè)結(jié)果說(shuō)明了當(dāng)父線程結(jié)束后,子線程還是可以繼續(xù)存在的,也就是子線程的生命周期并不受父線程的影響。也說(shuō)明了當(dāng)用戶線程還存在的情況下JVM進(jìn)程并不會(huì)終止。那么我們把上面的thread線程設(shè)置為守護(hù)線程后在運(yùn)行看看會(huì)有什么效果:

    //設(shè)置為守護(hù)線程
    thread.setDaemon(true);
    //啟動(dòng)子線
    thread.start();

執(zhí)行結(jié)果為:

如上在啟動(dòng)線程前設(shè)置線程為守護(hù)線程,從輸出結(jié)果可知JVM進(jìn)程已經(jīng)終止了,執(zhí)行ps -eaf |grep java 也看不到JVM進(jìn)程了。這個(gè)例子里面main函數(shù)是唯一的用戶線程,thread線程是守護(hù)線程,當(dāng)main線程運(yùn)行結(jié)束后,JVM發(fā)現(xiàn)當(dāng)前已經(jīng)沒(méi)有用戶線程了,就會(huì)終止JVM進(jìn)程。

Java中在main線程運(yùn)行結(jié)束后,JVM會(huì)自動(dòng)啟動(dòng)一個(gè)叫做DestroyJavaVM線程,該線程會(huì)等待所有用戶線程結(jié)束后終止JVM進(jìn)程,下面通過(guò)簡(jiǎn)單的JVM代碼來(lái)證明這個(gè)結(jié)論:

翻開(kāi)JVM的代碼,最終會(huì)調(diào)用到JavaMain這個(gè)c函數(shù)

int JNICALL
JavaMain(void * _args)
{  
  ...
  //執(zhí)行Java中的main函數(shù) 
  (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
  
  //main函數(shù)返回值
  ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1;
  
  //等待所有非守護(hù)線程結(jié)束,然后銷毀JVM進(jìn)程
  LEAVE();
}

LEAVE是c語(yǔ)言里面的一個(gè)宏定義,定義如下:

#define LEAVE() \
  do { \
    if ((*vm)->DetachCurrentThread(vm) != JNI_OK) { \
      JLI_ReportErrorMessage(JVM_ERROR2); \
      ret = 1; \
    } \
    if (JNI_TRUE) { \
      (*vm)->DestroyJavaVM(vm); \
      return ret; \
    } \
  } while (JNI_FALSE)

上面宏的作用實(shí)際是創(chuàng)建了一個(gè)名字叫做DestroyJavaVM的線程來(lái)等待所有用戶線程結(jié)束。

總結(jié):如果你想在主線程結(jié)束后JVM進(jìn)程馬上結(jié)束,那么創(chuàng)建線程的時(shí)候可以設(shè)置線程為守護(hù)線程,否者如果希望主線程結(jié)束后子線程繼續(xù)工作,等子線程結(jié)束后在讓JVM進(jìn)程結(jié)束那么就設(shè)置子線程為用戶線程,開(kāi)源框架Tomcat中就是用了守護(hù)線程和用戶線程聯(lián)合運(yùn)行起來(lái)的,具體敬請(qǐng)期待Java并發(fā)編程基礎(chǔ)之并發(fā)包源碼剖析一書(shū)出版。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中Calendar時(shí)間操作常用方法詳解

    Java中Calendar時(shí)間操作常用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java中Calendar時(shí)間操作常用方法,calendar中set方法和靜態(tài)屬性帶來(lái)的一些坑,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 詳細(xì)聊一聊java中封裝的那點(diǎn)事

    詳細(xì)聊一聊java中封裝的那點(diǎn)事

    封裝是一個(gè)非常廣泛的概念,小到一個(gè)屬性的封裝,大到一個(gè)框架或者一個(gè)項(xiàng)目的封裝,下面這篇文章主要給大家介紹了關(guān)于java中封裝的那點(diǎn)事,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Java中的CyclicBarrier循環(huán)柵欄深入解析

    Java中的CyclicBarrier循環(huán)柵欄深入解析

    這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄深入解析,CycleBarrier 它就相當(dāng)于是一個(gè)柵欄,所有線程在到達(dá)柵欄后都需要等待其他線程,等所有線程都到達(dá)后,再一起通過(guò),需要的朋友可以參考下
    2023-12-12
  • Java設(shè)計(jì)模式之橋接模式

    Java設(shè)計(jì)模式之橋接模式

    這篇文章介紹了Java設(shè)計(jì)模式之橋接模式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Java web過(guò)濾器驗(yàn)證登錄防止未登錄進(jìn)入界面

    Java web過(guò)濾器驗(yàn)證登錄防止未登錄進(jìn)入界面

    這篇文章主要介紹了Java web過(guò)濾器驗(yàn)證登錄防止未登錄進(jìn)入界面,在一些系統(tǒng)中經(jīng)??梢杂玫酱斯δ埽瑢?duì)java web 驗(yàn)證登錄知識(shí)感興趣的朋友一起看下吧
    2016-08-08
  • 詳解如何使用IntelliJ IDEA新建一個(gè)Servlet項(xiàng)目

    詳解如何使用IntelliJ IDEA新建一個(gè)Servlet項(xiàng)目

    這篇文章主要介紹了詳解如何使用IntelliJ IDEA新建一個(gè)Servlet項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • SpringBoot緩存抽象@Cacheable與緩存管理器配置方法

    SpringBoot緩存抽象@Cacheable與緩存管理器配置方法

    SpringBoot的緩存抽象通過(guò)@Cacheable注解和CacheManager接口,提供了靈活高效的緩存管理,本文詳細(xì)介紹了@Cacheable的使用技巧、緩存管理器配置方法、自定義鍵生成策略以及緩存同步與失效機(jī)制,幫助開(kāi)發(fā)者構(gòu)建高效的緩存策略,優(yōu)化應(yīng)用性能,感興趣的朋友一起看看吧
    2025-03-03
  • 基于<aop:aspect>與<aop:advisor>的區(qū)別

    基于<aop:aspect>與<aop:advisor>的區(qū)別

    這篇文章主要介紹了<aop:aspect>與<aop:advisor>的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中條件運(yùn)算符的嵌套使用技巧總結(jié)

    Java中條件運(yùn)算符的嵌套使用技巧總結(jié)

    在Java中,我們經(jīng)常需要使用條件運(yùn)算符來(lái)進(jìn)行多個(gè)條件的判斷和選擇,條件運(yùn)算符可以簡(jiǎn)化代碼,提高代碼的可讀性和執(zhí)行效率,本文將介紹條件運(yùn)算符的嵌套使用技巧,幫助讀者更好地掌握條件運(yùn)算符的應(yīng)用,需要的朋友可以參考下
    2023-11-11
  • JAVA函數(shù)的定義、使用方法實(shí)例分析

    JAVA函數(shù)的定義、使用方法實(shí)例分析

    這篇文章主要介紹了JAVA函數(shù)的定義、使用方法,結(jié)合實(shí)例形式分析了JAVA函數(shù)的基本概念、功能、原理、定義、使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04

最新評(píng)論

军事| 乐陵市| 石楼县| 洛阳市| 新河县| 栾川县| 增城市| 手游| 建德市| 南漳县| 南投市| 宜兴市| 尉氏县| 赣州市| 余干县| 仁化县| 忻州市| 九台市| 敦煌市| 耒阳市| 平远县| 湘乡市| 辽宁省| 潜江市| 长宁区| 曲水县| 德江县| 大渡口区| 丽江市| 壤塘县| 阳新县| 上杭县| 盘锦市| 稷山县| 武穴市| 吉木乃县| 合水县| 建昌县| 乌兰浩特市| 通海县| 宁乡县|