說說 守護線程 與 非守護線程 的區別


  • 什么是守護線程,什么是非守護線程?
    • java有兩種狀態的線程
    • 守護線程與非守護線程的區別
  • 守護線程與非守護線程代碼演示區別
    • 創建守護線程
    • 守護線程:主線程銷毀停止,守護線程一起銷毀
    • 非守護線程:如果主線程銷毀,用戶線程繼續運行且互不影響。

什么是守護線程,什么是非守護線程?

java有兩種狀態的線程

  1. 守護線程(例如垃圾回收線程:gc線程)
  2. 非守護線程(用戶線程:用戶線程即我們手動創建的線程)

守護線程與非守護線程的區別

1.守護線程

  • 有一個特征,例如當主線程運行的時候,垃圾回收線程一起運行。
  • 當主線程銷毀,會和主線程一起銷毀。

2.非守護線程

  • 如果主線程銷毀,用戶線程繼續運行且互不影響。

守護線程與非守護線程代碼演示區別

創建守護線程

public static void main(String[] args) throws InterruptedException {
  Thread t1 = new Thread(new Runnable() {

   public void run() {
    while (true) {
     try {
      Thread.sleep(1000);

     } catch (Exception e) {
      // TODO: handle exception
     }
     System.out.println("我是子線程(用戶線程)");
    }
   }
  });
  // 標識當前方法為守護線程,一定要在啟動線程前設置為守護線程
  t1.setDaemon(true);
  t1.start();

必須在t1.start()之前設置,你不能把正在運行的常規線程設置為守護線程,否則報IllegalThreadStateException異常

守護線程:主線程銷毀停止,守護線程一起銷毀

public static void main(String[] args) {
  Thread t1 = new Thread(new Runnable() {
   
   public void run() {
    while (true) {
     try {
      Thread.sleep(1000);

     } catch (Exception e) {
      // TODO: handle exception
     }
     System.out.println("我是子線程(用戶線程)");
    }
   }
  });
  // 標識當前方法為守護線程,一定要在啟動線程前設置為守護線程
  t1.setDaemon(true);
  //啟動線程
  t1.start();
  
  //相當與主線程
  for (int i = 0; i < 10; i++) {
   try {
    Thread.sleep(300);
   } catch (Exception e) {
    e.printStackTrace();
   }
   System.out.println("main:i:" + i);
  }
  System.out.println("主線程執行完畢...");
 }

以下為運行結果:

main:i:0
main:i:1
main:i:2
我是子線程(用戶線程)
main:i:3
main:i:4
main:i:5
我是子線程(用戶線程)
main:i:6
main:i:7
main:i:8
我是子線程(用戶線程)
main:i:9
主線程執行完畢...

主線程結束之后並沒有在繼續運行守護線程,守護線程也跟着結束,一起銷毀停止。

非守護線程:如果主線程銷毀,用戶線程繼續運行且互不影響。

public static void main(String[] args) {
  Thread t1 = new Thread(new Runnable() {
   
   public void run() {
    while (true) {
     try {
      Thread.sleep(1000);

     } catch (Exception e) {
      // TODO: handle exception
     }
     System.out.println("我是子線程(用戶線程)");
    }
   }
  });
  //啟動線程
  t1.start();
  
  //相當與主線程
  for (int i = 0; i < 10; i++) {
   try {
    Thread.sleep(300);
   } catch (Exception e) {
    e.printStackTrace();
   }
   System.out.println("main:i:" + i);
  }
  System.out.println("主線程執行完畢...");
 }

以下為運行結果:

main:i:0
main:i:1
main:i:2
我是子線程(用戶線程)
main:i:3
main:i:4
main:i:5
我是子線程(用戶線程)
main:i:6
main:i:7
main:i:8
我是子線程(用戶線程)
main:i:9
主線程執行完畢...
我是子線程(用戶線程)
我是子線程(用戶線程)
我是子線程(用戶線程)
我是子線程(用戶線程)
我是子線程(用戶線程)
我是子線程(用戶線程)
。。。。。。。。。。。。。。。。。。。。。

當主線程銷毀停止,非守護線程(用戶線程)並沒有結束,而是一直在執行,與主線程互不影響。

來源:blog.csdn.net/yang2812098/article/details/87651721


免責聲明!

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



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