溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中怎么實(shí)現(xiàn)守護(hù)線程與用戶線程

發(fā)布時(shí)間:2021-06-17 11:38:58 來(lái)源:億速云 閱讀:209 作者:Leah 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)Java中怎么實(shí)現(xiàn)守護(hù)線程與用戶線程,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

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ù)線程并沒(méi)有太大區(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中無(wú)任何用戶進(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)銷毀

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

  1. 在線程啟動(dòng)之前, 及執(zhí)行thread.start() 方法前, 設(shè)置thread.setDemon(true);

  2. 在守護(hù)線程中啟動(dòng)的子線程也是守護(hù)線程

  3. 守護(hù)線程不建議進(jìn)行寫(xiě)操作, 因?yàn)槭刈o(hù)進(jìn)程隨時(shí)可能結(jié)束。

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

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

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

開(kāi)發(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)行無(wú)線循環(huán), 程序不終止。

  2. 設(shè)置thread.setDaemon(true)后, 線程變成守護(hù)線程, 程序直接終止, 僅輸出一行信息"main thread done"。 因?yàn)槌绦驁?zhí)行完system 語(yǔ)句之后, 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í)通過(guò)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());
 }
}

關(guān)于Java中怎么實(shí)現(xiàn)守護(hù)線程與用戶線程就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI