中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java中怎么實現守護線程與用戶線程

發布時間:2021-06-17 11:38:58 來源:億速云 閱讀:210 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關Java中怎么實現守護線程與用戶線程,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

1. Java 線程

1.1 守護線程與用戶線程

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

  1. 通常情況下,我們使用Thread 創建的線程在默認情況下都屬于用戶線程, 當在啟動線程之前, 執行thread.setDaemon(true)時, 線程會變成守護線程。

  2. 其實在本質上,用戶線程和守護線程并沒有太大區別,唯一的區別就是會影響虛擬機的退出(程序的終止)。當jvm中只剩下守護線程時,虛擬機會退出,及程序終止;而當jvm中至少擁有一個用戶線程時,jvm都不會退出。

1.2 守護線程特點

Java 中的守護線程和linux 中的守護進程還是有些區別的, linux 守護進程時系統級別的, 當系統退出時, 才會終止. 而java 中的守護線程時jvm 級別的, 當jvm中無任何用戶進程時, 守護進程銷毀, jvm 退出, 程序終止. 筆者認為java 守護進程的最主要的特點有:

  1. 守護進程是運行在程序后臺的線程

  2. 守護進程創建的進程,依然時守護進程

  3. 守護進程不會影響jvm的退出,當jvm只剩余守護進程時,jvm 進行退出

  4. 守護進行在jvm退出時,自動銷毀

在開發java 守護線程時, 需要注意:

  1. 在線程啟動之前, 及執行thread.start() 方法前, 設置thread.setDemon(true);

  2. 在守護線程中啟動的子線程也是守護線程

  3. 守護線程不建議進行寫操作, 因為守護進程隨時可能結束。

1.3 守護線程適用場景

針對于守護線程的特點,筆者認為,java 守護線程通常可用于開發一些為其它用戶線程服務的功能。比如說心跳檢測,事件監聽等。Java 中最有名的守護進程當屬GC(垃圾回收)

2. java 守護線程開發

開發守護進程時需要注意兩點:

  1. 必須在線程啟動之前,即執行thread.start()方法前, 執行thread.setDaemon(true) 方法,否則會拋出異常IllegalThreadStateException

  2. 守護線程中創建的線程也是守護線程

2.1 測試程序退出

  1. 注釋thread.setDaemon(true)時, 線程為用戶線程, 程序進行無線循環, 程序不終止。

  2. 設置thread.setDaemon(true)后, 線程變成守護線程, 程序直接終止, 僅輸出一行信息"main thread done"。 因為程序執行完system 語句之后, main 程序作為唯一的一個用戶線程執行結束了, jvm 中只剩下一個守護進程,所以jvm 便退出了。

public class TestThread {

 public static void main(String[] args) {

  AnsyTask ansyTask = new AnsyTask();

  Thread thread = new Thread(ansyTask);

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

  // 啟動線程
  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 測試守護線程中創建新的線程

測試會發現, 默認情況下, 守護線程創建的子線程依然是守護線程,用戶創建的守護線程依然時用戶線程。也可以在創建子線程時通過setDaemon()方法修改.

public class TestThread {

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

  AnsyTask ansyTask = new AnsyTask();

  Thread thread = new Thread(ansyTask);

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

  // 啟動線程
  thread.start();

  // 給守護線程點兒執行時間
  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中怎么實現守護線程與用戶線程就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

西和县| 定西市| 鹰潭市| 武山县| 万源市| 丰顺县| 淮安市| 佛教| 厦门市| 成武县| 遂宁市| 福建省| 呈贡县| 巴青县| 河北省| 尼木县| 文成县| 荆州市| 平远县| 紫阳县| 萝北县| 开原市| 松潘县| 精河县| 萨迦县| 沧州市| 太保市| 永定县| 海宁市| 依安县| 浑源县| 莱西市| 双鸭山市| 长丰县| 灌云县| 安庆市| 连云港市| 安泽县| 轮台县| 和硕县| 雅江县|