Java多線程之守護線程


Java多線程之守護線程

一、前言

  • Java線程有兩類:

    • 用戶線程:運行在前台,執行具體的任務,程序的主線程,連接網絡的子線程等都是用戶線程

    • 守護線程:運行在后台,為其他前台線程服務

      • 特點:一旦所有用戶線程都結束運行,守護線程會隨JVM一起結束工作

      • 應用:數據庫連接池中的監測線程JVM啟動后的監測線程

      • 最常見的守護線程:垃圾回收線程

      • 如何設置守護線程:可以通過Thread類的setDaemon(true)方法來設置當前的線程為守護線程

  • 注意事項:

    • setDaemon(true)必須在start方法之前調用,否則會拋出IllegalThreadStateException異常

    • 在守護線程中產生的新線程也是守護線程

    • 不是所有的任務都可以分配給守護線程來執行,比如讀寫操作或者計算邏輯

二、代碼分析:

 1 package me.demo.daemon;  2 
 3 import java.io.File;  4 import java.io.FileOutputStream;  5 import java.io.OutputStream;  6 import java.util.Scanner;  7 
 8 class DaemonThread implements Runnable {  9 
10  @Override 11     public void run() { 12     System.out.println("進入守護線程:" + Thread.currentThread().getName()); 13     try { 14  WriteToFile(); 15     } catch (Exception e) { 16  e.printStackTrace(); 17  } 18     System.out.println("退出守護線程:" + Thread.currentThread().getName()); 19  } 20 
21     private void WriteToFile() throws Exception { 22     File file = new File("E:" + File.separator + "daemon.txt"); 23     // true代表追加操作
24     OutputStream os = new FileOutputStream(file, true); 25     int count = 0; 26     while (count < 999) { 27         os.write(("\r\nword" + count).getBytes()); 28         System.out.println("守護線程" + Thread.currentThread().getName() + "向文件中寫入了Word" + count++); 29         Thread.sleep(1000); 30  } 31  os.close(); 32  } 33 
34 } 35 
36 public class DaemonThreadDemo { 37 
38     public static void main(String[] args) { 39     System.out.println("進入主線程:" + Thread.currentThread().getName()); 40     DaemonThread daemonThread = new DaemonThread(); 41     Thread thread = new Thread(daemonThread); 42     thread.setDaemon(true); // 設為守護線程
43  thread.start(); 44 
45     /**
46  * 主線程阻塞等待鍵盤輸入 由於此時主線程是唯一的用戶線程 所以當主線程退出,則守護線程也會退出 47  * 即while循環提前退出,導致守護線程寫入數據的不完整性 48      */
49     Scanner input = new Scanner(System.in); 50  input.next(); 51  input.close(); 52     System.out.println("退出主線程:" + Thread.currentThread().getName()); 53  } 54 }
View Code

  運行這個程序,如果我們不做任何操作,他將會向E盤下的daemon.txt文件寫入數據,直到while循環結束,並先后打印出退出守護線程和退出主線程字段信息,期間我們如果向控制台輸入任意字符串並回車,由於主線程阻塞等待鍵盤輸入,並且此時主線程是唯一的用戶線程 所以當主線程退出,則守護線程也會退出,即while循環提前退出,導致守護線程寫入數據的不完整性,這正應證了我上面提到的守護線程的特點:一旦所有用戶線程都結束運行,守護線程會隨JVM一起結束工作

如果,您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下角的【推薦】。
如果,您希望更容易地發現我的新博客,不妨點擊一下左下角的【關注我】。
如果,您對我的博文感興趣,可以關注我的后續博客,我是【AlbertRui】。

轉載請注明出處及鏈接地址,歡迎轉載!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM