欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java線程-守護(hù)線程與用戶線程

 更新時(shí)間:2019年04月02日 15:35:10   作者:情深見鹿  
這篇文章主要介紹了Java守護(hù)線程與用戶線程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

干java 開發(fā)這么多年, 之前一直沒留意java 進(jìn)程還區(qū)分守護(hù)進(jìn)程和用戶進(jìn)程。守護(hù)進(jìn)程這個(gè)概念最早還是在linux系統(tǒng)中接觸的,直到近期使用java開發(fā)心跳檢測(cè)功能時(shí),使用Timer時(shí)才發(fā)現(xiàn)原來java也有守護(hù)線程的概念。

1. Java 線程

1.1 守護(hù)線程與用戶線程

Java 線程分為守護(hù)線程(DaemonThread) 和 用戶線程(UserThread)兩類.

  1. 通常情況下,我們使用Thread 創(chuàng)建的線程在默認(rèn)情況下都屬于用戶線程, 當(dāng)在啟動(dòng)線程之前, 執(zhí)行thread.setDaemon(true)時(shí), 線程會(huì)變成守護(hù)線程。
  2. 其實(shí)在本質(zhì)上,用戶線程和守護(hù)線程并沒有太大區(qū)別,唯一的區(qū)別就是會(huì)影響虛擬機(jī)的退出(程序的終止)。當(dāng)jvm中只剩下守護(hù)線程時(shí),虛擬機(jī)會(huì)退出,及程序終止;而當(dāng)jvm中至少擁有一個(gè)用戶線程時(shí),jvm都不會(huì)退出。

1.2 守護(hù)線程特點(diǎn)

Java 中的守護(hù)線程和linux 中的守護(hù)進(jìn)程還是有些區(qū)別的, linux 守護(hù)進(jìn)程時(shí)系統(tǒng)級(jí)別的, 當(dāng)系統(tǒng)退出時(shí), 才會(huì)終止. 而java 中的守護(hù)線程時(shí)jvm 級(jí)別的, 當(dāng)jvm中無任何用戶進(jìn)程時(shí), 守護(hù)進(jìn)程銷毀, jvm 退出, 程序終止. 筆者認(rèn)為java 守護(hù)進(jìn)程的最主要的特點(diǎn)有:

  1. 守護(hù)進(jìn)程是運(yùn)行在程序后臺(tái)的線程
  2. 守護(hù)進(jìn)程創(chuàng)建的進(jìn)程,依然時(shí)守護(hù)進(jìn)程
  3. 守護(hù)進(jìn)程不會(huì)影響jvm的退出,當(dāng)jvm只剩余守護(hù)進(jìn)程時(shí),jvm 進(jìn)行退出
  4. 守護(hù)進(jìn)行在jvm退出時(shí),自動(dòng)銷毀

在開發(fā)java 守護(hù)線程時(shí), 需要注意:

  1. 在線程啟動(dòng)之前, 及執(zhí)行thread.start() 方法前, 設(shè)置thread.setDemon(true);
  2. 在守護(hù)線程中啟動(dòng)的子線程也是守護(hù)線程
  3. 守護(hù)線程不建議進(jìn)行寫操作, 因?yàn)槭刈o(hù)進(jìn)程隨時(shí)可能結(jié)束。

1.3 守護(hù)線程適用場(chǎng)景

針對(duì)于守護(hù)線程的特點(diǎn),筆者認(rèn)為,java 守護(hù)線程通??捎糜陂_發(fā)一些為其它用戶線程服務(wù)的功能。比如說心跳檢測(cè),事件監(jiān)聽等。Java 中最有名的守護(hù)進(jìn)程當(dāng)屬GC(垃圾回收)

2. java 守護(hù)線程開發(fā)

開發(fā)守護(hù)進(jìn)程時(shí)需要注意兩點(diǎn):

  1. 必須在線程啟動(dòng)之前,即執(zhí)行thread.start()方法前, 執(zhí)行thread.setDaemon(true) 方法,否則會(huì)拋出異常IllegalThreadStateException
  2. 守護(hù)線程中創(chuàng)建的線程也是守護(hù)線程

2.1 測(cè)試程序退出

  1. 注釋thread.setDaemon(true)時(shí), 線程為用戶線程, 程序進(jìn)行無線循環(huán), 程序不終止。
  2. 設(shè)置thread.setDaemon(true)后, 線程變成守護(hù)線程, 程序直接終止, 僅輸出一行信息"main thread done"。 因?yàn)槌绦驁?zhí)行完system 語句之后, main 程序作為唯一的一個(gè)用戶線程執(zhí)行結(jié)束了, jvm 中只剩下一個(gè)守護(hù)進(jìn)程,所以jvm 便退出了。
public class TestThread {

 public static void main(String[] args) {

  AnsyTask ansyTask = new AnsyTask();

  Thread thread = new Thread(ansyTask);

  // 設(shè)置線程為異步線程
  // thread.setDaemon(true);

  // 啟動(dòng)線程
  thread.start();
  
  System.out.println("main thread done");
 }
}

class AnsyTask implements Runnable{

 @Override
 public void run() {
  while (true){
   System.out.println(LocalDateTime.now() + "-hello,thread");
  }
 }
}

2.2 測(cè)試守護(hù)線程中創(chuàng)建新的線程

測(cè)試會(huì)發(fā)現(xiàn), 默認(rèn)情況下, 守護(hù)線程創(chuàng)建的子線程依然是守護(hù)線程,用戶創(chuàng)建的守護(hù)線程依然時(shí)用戶線程。也可以在創(chuàng)建子線程時(shí)通過setDaemon()方法修改.

public class TestThread {

 public static void main(String[] args) throws InterruptedException {

  AnsyTask ansyTask = new AnsyTask();

  Thread thread = new Thread(ansyTask);

  // 設(shè)置線程為異步線程
  thread.setDaemon(true);

  // 啟動(dòng)線程
  thread.start();

  // 給守護(hù)線程點(diǎn)兒執(zhí)行時(shí)間
  Thread.sleep(1000l);
 }
}

class AnsyTask implements Runnable{

 @Override
 public void run() {
  Thread thread = new Thread("subThread");
  System.out.println(thread.getName() + " is daemon:" + thread.isDaemon());
 }
}

以上所述是小編給大家介紹的Java守護(hù)線程與用戶線程詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • springboot 如何使用jackson來處理實(shí)體類

    springboot 如何使用jackson來處理實(shí)體類

    這篇文章主要介紹了springboot使用jackson來處理實(shí)體類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring Boot啟動(dòng)時(shí)調(diào)用自己的非web邏輯

    Spring Boot啟動(dòng)時(shí)調(diào)用自己的非web邏輯

    在spring Boot中,有些代碼是WEB功能,例如API等,但是有些邏輯是非WEB,啟動(dòng)時(shí)就要調(diào)用并持續(xù)運(yùn)行的,該如何加載自己的非WEB邏輯呢,下面通過實(shí)例代碼給大家講解,一起看看吧
    2017-07-07
  • java中Swing五種常見的布局方式

    java中Swing五種常見的布局方式

    本文通過代碼示例給大家詳細(xì)講解了java中Swing五種常見的布局方式,以及相關(guān)注意知識(shí)點(diǎn),有興趣的朋友參考學(xué)習(xí)下。
    2018-03-03
  • Springboot遷移到Micronaut實(shí)現(xiàn)過程詳解

    Springboot遷移到Micronaut實(shí)現(xiàn)過程詳解

    這篇文章主要為大家?介紹了Springboot遷移到Micronaut實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java工程如何打印程序日志過程解析

    Java工程如何打印程序日志過程解析

    這篇文章主要介紹了Java工程如何打印程序日志過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 使用cmd根據(jù)WSDL網(wǎng)址生成java客戶端代碼的實(shí)現(xiàn)

    使用cmd根據(jù)WSDL網(wǎng)址生成java客戶端代碼的實(shí)現(xiàn)

    這篇文章主要介紹了使用cmd根據(jù)WSDL網(wǎng)址生成java客戶端代碼的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫(kù)加密以及踩坑的記錄分享

    SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫(kù)加密以及踩坑的記錄分享

    這篇文章主要介紹了SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫(kù)加密以及踩坑,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • springboot多模塊中的共用配置文件詳解

    springboot多模塊中的共用配置文件詳解

    這篇文章主要介紹了springboot多模塊中的共用配置文件詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring?Boot?中的?@HystrixCommand?注解原理及使用方法

    Spring?Boot?中的?@HystrixCommand?注解原理及使用方法

    通過使用 @HystrixCommand 注解,我們可以輕松地實(shí)現(xiàn)對(duì)方法的隔離和監(jiān)控,從而提高系統(tǒng)的可靠性和穩(wěn)定性,本文介紹了Spring Boot 中的@HystrixCommand注解是什么,其原理以及如何使用,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • java中動(dòng)態(tài)代理如何實(shí)現(xiàn)詳解

    java中動(dòng)態(tài)代理如何實(shí)現(xiàn)詳解

    動(dòng)態(tài)代理是基于接口實(shí)現(xiàn)的代理,mybatis就是用這個(gè)技術(shù)實(shí)現(xiàn)的,下面這篇文章主要給大家介紹了關(guān)于java中動(dòng)態(tài)代理如何實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評(píng)論