91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在java中創建守護線程的方法

發布時間:2020-12-08 15:45:04 來源:億速云 閱讀:481 作者:Leah 欄目:編程語言

本篇文章為大家展示了在java中創建守護線程的方法,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Java線程分為兩類分別為daemon線程(守護線程)和User線程(用戶線程),在JVM啟動時候會調用main函數,main函數所在的線程是一個用戶線程,這個是我們可以看到的線程,其實JVM內部同時還啟動了好多守護線程,比如垃圾回收線程。那么守護線程和用戶線程有什么區別那?區別之一是當最后一個非守護線程結束時候,JVM會正常退出,而不管當前是否有守護線程,也就是說守護線程是否結束并不影響JVM的退出。言外之意是只要有一個用戶線程還沒結束正常情況下JVM就不會退出。

創建守護線程的方法:

public static void main(String[] args) {

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

可知只需要設置線程的daemon參數為true即可。

下面通過例子來加深用戶線程與守護線程的區別的理解,首先看下面代碼:

public static void main(String[] args) {

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

結果輸出為:

在java中創建守護線程的方法

如上代碼在main線程中創建了一個thread線程,thread線程里面是無限循環,運行代碼從結果看main線程已經運行結束了,那么JVM進行已經退出了?從IDE的輸出結果右側上的紅色方塊說明JVM進程并沒有退出,另外
mac上執行ps -eaf | grep java會輸出結果,也可以證明這個結論。

這個結果說明了當父線程結束后,子線程還是可以繼續存在的,也就是子線程的生命周期并不受父線程的影響。也說明了當用戶線程還存在的情況下JVM進程并不會終止。那么我們把上面的thread線程設置為守護線程后在運行看看會有什么效果:

    //設置為守護線程
    thread.setDaemon(true);
    //啟動子線
    thread.start();

執行結果為:

在java中創建守護線程的方法

如上在啟動線程前設置線程為守護線程,從輸出結果可知JVM進程已經終止了,執行ps -eaf |grep java 也看不到JVM進程了。這個例子里面main函數是唯一的用戶線程,thread線程是守護線程,當main線程運行結束后,JVM發現當前已經沒有用戶線程了,就會終止JVM進程。

Java中在main線程運行結束后,JVM會自動啟動一個叫做DestroyJavaVM線程,該線程會等待所有用戶線程結束后終止JVM進程,下面通過簡單的JVM代碼來證明這個結論:

翻開JVM的代碼,最終會調用到JavaMain這個c函數

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

LEAVE是c語言里面的一個宏定義,定義如下:

#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)

上述內容就是在java中創建守護線程的方法,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霍林郭勒市| 巩留县| 水富县| 济宁市| 张北县| 资讯| 马鞍山市| 嘉义县| 花垣县| 凤阳县| 南通市| 河池市| 葵青区| 微山县| 雅江县| 应用必备| 剑川县| 山阴县| 中山市| 梓潼县| 西乌珠穆沁旗| 白朗县| 礼泉县| 科技| 凤翔县| 留坝县| 楚雄市| 阳东县| 青阳县| 黔南| 武隆县| 海口市| 玉环县| 岢岚县| 井研县| 宝应县| 曲麻莱县| 惠水县| 东平县| 上虞市| 淳化县|