一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務器之家 - 編程語言 - Java教程 - java高并發的用戶線程和守護線程詳解

java高并發的用戶線程和守護線程詳解

2022-03-02 00:52路人甲Java Java教程

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

守護線程是一種特殊的線程,在后臺默默地完成一些系統性的服務,比如垃圾回收線程、JIT線程都是守護線程。與之對應的是用戶線程,用戶線程可以理解為是系統的工作線程,它會完成這個程序需要完成的業務操作。如果用戶線程全部結束了,意味著程序需要完成的業務操作已經結束了,系統可以退出了。所以當系統只剩下守護進程的時候,java虛擬機會自動退出。

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

下面我們來看一下守護線程的一些特性。

 

程序只有守護線程時,系統會自動退出

package com.itsoku.chat03;	
/**	
* 微信公眾號:路人甲Java,專注于java技術分享(帶你玩轉 爬蟲、分布式事務、異步消息服務、任務調度、分庫分表、大數據等),喜歡請關注!	
*/	
public class Demo1 {	
  public static class T1 extends Thread {	
      public T1(String name) {	
          super(name);	
      }	
      @Override	
      public void run() {	
          System.out.println(this.getName() + "開始執行," + (this.isDaemon() ? "我是守護線程" : "我是用戶線程"));	
          while (true) ;	
      }	
  }	
  public static void main(String[] args) {	
      T1 t1 = new T1("子線程1");	
      t1.start();	
      System.out.println("主線程結束");	
  }	
}

運行上面代碼,結果如下:

java高并發的用戶線程和守護線程詳解

可以看到主線程已經結束了,但是程序無法退出,原因:子線程1是用戶線程,內部有個死循環,一直處于運行狀態,無法結束。

再看下面的代碼:

package com.itsoku.chat03;	
/**	
* 微信公眾號:路人甲Java,專注于java技術分享(帶你玩轉 爬蟲、分布式事務、異步消息服務、任務調度、分庫分表、大數據等),喜歡請關注!	
*/	
public class Demo2 {	
  public static class T1 extends Thread {	
      public T1(String name) {	
          super(name);	
      }	
      @Override	
      public void run() {	
          System.out.println(this.getName() + "開始執行," + (this.isDaemon() ? "我是守護線程" : "我是用戶線程"));	
          while (true) ;	
      }	
  }	
  public static void main(String[] args) {	
      T1 t1 = new T1("子線程1");	
      t1.setDaemon(true);	
      t1.start();	
      System.out.println("主線程結束");	
  }	
}

運行結果:

java高并發的用戶線程和守護線程詳解

程序可以正常結束了,代碼中通過 t1.setDaemon(true); 將t1線程設置為守護線程,main方法所在的主線程執行完畢之后,程序就退出了。

結論:當程序中所有的用戶線程執行完畢之后,不管守護線程是否結束,系統都會自動退出。

 

設置守護線程,需要在start()方法之前進行

package com.itsoku.chat03;	
import java.util.concurrent.TimeUnit;	
/**	
* 微信公眾號:路人甲Java,專注于java技術分享(帶你玩轉 爬蟲、分布式事務、異步消息服務、任務調度、分庫分表、大數據等),喜歡請關注!	
*/	
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()方法之后執行的,執行會報異常,運行結果如下:

java高并發的用戶線程和守護線程詳解

 

線程daemon的默認值

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

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

dameon的默認值為為父線程的daemon,也就是說,父線程如果為用戶線程,子線程默認也是用戶現場,父線程如果是守護線程,子線程默認也是守護線程。

示例代碼:

package com.itsoku.chat03;	
import java.util.concurrent.TimeUnit;	
/**	
* 微信公眾號:路人甲Java,專注于java技術分享(帶你玩轉 爬蟲、分布式事務、異步消息服務、任務調度、分庫分表、大數據等),喜歡請關注!	
*/	
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);	
  }	
}

運行代碼,輸出:

main.daemon:false
t1.daemon:false
t2.daemon:true
t3.daemon:true

t1是由主線程(main方法所在的線程)創建的,main線程是t1的父線程,所以t1.daemon為false,說明t1是用戶線程。

t2線程調用了 setDaemon(true);將其設為守護線程,t3是由t2創建的,所以t3默認線程類型和t2一樣,t2.daemon為true。

 

總結

1.java中的線程分為用戶線程和守護線程

2.程序中的所有的用戶線程結束之后,不管守護線程處于什么狀態,java虛擬機都會自動退出

3.調用線程的實例方法setDaemon()來設置線程是否是守護線程

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

5.線程的daemon默認值和其父線程一樣

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://itsoku.blog.csdn.net/article/details/100036209

延伸 · 閱讀

精彩推薦
  • Java教程使用Java實現Redis限流的方法

    使用Java實現Redis限流的方法

    限流的作用是防止某個段時間段內的請求數過多,造成模塊因高并發而不可用。這篇文章給大家介紹使用Java實現Redis限流的相關知識,一起看看吧...

    別團等shy哥發育12112022-01-19
  • Java教程Java使用設計模式中的工廠方法模式實例解析

    Java使用設計模式中的工廠方法模式實例解析

    當系統準備為用戶提供某個類的子類的實例,又不想讓用戶代碼和該子類形成耦合時,就可以使用工廠方法模式來設計系統.工廠方法模式的關鍵是在一個接口...

    pastqing5642020-04-28
  • Java教程深入學習SpringCloud之SpringCloud簡介

    深入學習SpringCloud之SpringCloud簡介

    Spring Cloud是一個一站式的開發分布式系統的框架,為開發者提供了一系列的構建分布式系統的工具集,本文給大家介紹springcloud的相關知識,感興趣的朋友...

    懸鈴木pp12052021-09-02
  • Java教程Java實現MD5加密的方法

    Java實現MD5加密的方法

    這篇文章主要介紹了Java實現MD5加密的方法,實例分析了基于java實現md5加密的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    fzhlee3482019-12-28
  • Java教程Spring 使用Validation 驗證框架的問題詳解

    Spring 使用Validation 驗證框架的問題詳解

    Spring Boot在內部通過集成hibernate-validation已經實現了JSR-349驗證規范接口,在Spring Boot項目中只要直接使用就行了。 一般用在Controller中用于驗證前端傳來的參...

    小畢超5182021-10-29
  • Java教程java實現字符串反轉

    java實現字符串反轉

    這篇文章主要為大家詳細介紹了java實現字符串反轉,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    wanlifeipeng5102020-09-28
  • Java教程啟動Tomcat報錯Unsupported major.minor version xxx的解決方法

    啟動Tomcat報錯Unsupported major.minor version xxx的解決方法

    這篇文章主要為大家詳細介紹了啟動Tomcat報錯Unsupported major.minor version xxx的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    劉水鏡6542021-02-20
  • Java教程java實現的DES加密算法詳解

    java實現的DES加密算法詳解

    這篇文章主要介紹了java實現的DES加密算法,結合實例形式詳細分析了java實現DES加密操作的原理、實現技巧與相關注意事項,需要的朋友可以參考下...

    聽著music睡7722020-11-24
主站蜘蛛池模板: 2021日本三级理论影院 | 国产愉拍精品视频手机 | 日本高清视频网站 | 欧美日韩一区二区三区在线播放 | 亚洲一区二区三区深夜天堂 | 久久精品免视看国产 | 动漫美女人物被黄漫小说 | 青青草原手机在线视频 | 男人天堂中文字幕 | 万域之王在线观看 | 成人网18免费网站 | 亚洲AV无码专区国产精品麻豆 | 精品国产免费第一区二区 | 国产高清视频一区二区 | 国产成人综合网亚洲欧美在线 | 亚洲人的天堂男人爽爽爽 | 操穴勤 | 91亚色视频在线观看 | 香蕉国产成版人视频在线观看 | 免费xxxx日本大片在线观看 | 幸福草电视剧演员表介绍 | 日韩国产欧美成人一区二区影院 | 999精品视频在线观看热6 | 嫩草影院永久在线播放 | 日本xxxⅹ69xxxx护士 | 欧美日韩国产精品自在自线 | 日韩国产欧美视频 | 国产乱叫456在线 | 亚洲人成网站在线观看妞妞网 | 99re热这里只有精品视频 | 免费高清视频在线观看 | 欧美另类videos另类粗暴 | 国产情侣自拍网 | 玩50岁四川熟女大白屁股直播 | 国产乱子伦在线观看不卡 | 国产亚洲欧美日韩俺去了 | 精品国产精品国产偷麻豆 | 五月婷婷丁香在线视频 | 国产成人高清精品免费5388密 | 美女脱得一二净无内裤全身的照片 | 国产全部视频 |