真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

在java中創(chuàng)建守護(hù)線程的方法

本篇文章為大家展示了在java中創(chuàng)建守護(hù)線程的方法,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)主營(yíng)河?xùn)|網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開發(fā),河?xùn)|h5微信小程序開發(fā)搭建,河?xùn)|網(wǎng)站營(yíng)銷推廣歡迎河?xùn)|等地區(qū)企業(yè)咨詢

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ì)退出。

創(chuàng)建守護(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é)果輸出為:

在java中創(chuàng)建守護(hù)線程的方法

如上代碼在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é)果為:

在java中創(chuàng)建守護(hù)線程的方法

如上在啟動(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é)論:

翻開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)

上述內(nèi)容就是在java中創(chuàng)建守護(hù)線程的方法,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享名稱:在java中創(chuàng)建守護(hù)線程的方法
URL網(wǎng)址:http://weahome.cn/article/jchpss.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部