国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談java中守護線程與用戶線程

淺談java中守護線程與用戶線程

2021-01-13 14:30今天你不奮斗明天你就落 Java教程

本篇文章主要介紹了淺談java中守護線程與用戶線程,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

那么Java中如何創建一個守護線程那?代碼如下:

java" id="highlighter_745923">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
 
    Thread daemonThread = new Thread(new Runnable() {
      public void run() {
        
      }
    });
    
    //設置為守護線程
    daemonThread.setDaemon(true);
    daemonThread.start();
    
  }

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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線程設置為守護線程后在運行看看會有什么效果:

?
1
2
3
4
//設置為守護線程
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函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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語言里面的一個宏定義,定義如下:

?
1
2
3
4
5
6
7
8
9
10
11
#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)

上面宏的作用實際是創建了一個名字叫做DestroyJavaVM的線程來等待所有用戶線程結束。

總結:如果你想在主線程結束后JVM進程馬上結束,那么創建線程的時候可以設置線程為守護線程,否者如果希望主線程結束后子線程繼續工作,等子線程結束后在讓JVM進程結束那么就設置子線程為用戶線程,開源框架Tomcat中就是用了守護線程和用戶線程聯合運行起來的,具體敬請期待Java并發編程基礎之并發包源碼剖析一書出版。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.jianshu.com/p/c9e3001cd821?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日本一区二区免费在线播放 | 国产色播av在线 | 国产免费一区二区三区 | 国产精品1 | 色爱综合网 | 久久久久亚洲精品 | 黄色av网站在线观看 | 欧美日韩一区在线 | 国产三区av | 黄色一级免费大片 | 欧美午夜精品久久久久免费视 | 日韩精品一区二区三区在线观看 | 99久久精品国产一区二区三区 | 国产精品久久国产精品 | 亚洲精品国产第一综合99久久 | 欧美黑人性暴力猛交喷水黑人巨大 | 欧美电影网站 | 91视频.com | 国产精品久久久久久a | 日韩一级大片 | 国产操片| 一级黄色片网站 | 国产精品美女久久久久久久久久久 | 精品久久久久香蕉网 | 亚洲综合视频 | 精品黄色 | 午夜免费视频 | 亚洲福利 | 三及毛片| 亚洲免费观看在线视频 | 久久国产亚洲 | 欧美成人一级 | 亚洲欧美在线精品 | 在线日韩一区 | 中文在线一区二区三区 | 日韩视频在线一区二区 | 久久h| 国产成年免费视频 | 午夜精品福利在线观看 | 午夜免费 | 欧美第8页 |