Java 多線程(四)之守護線程(Daemon)
阿新 • • 發佈:2018-08-30
機會 兩種 如何 產生 tex begin 就會 set final
定義
Java 中有兩種線程: 一種是用戶線程(User Thread),一種是守護線程(Daemon Thread)。
守護線程是一種特殊的線程, 它的特殊有“陪伴”的含義, 當線程中不存在非守護線程時, 則守護線程自動銷毀。
垃圾回收線程就是一種守護線程, 當線程中沒有非守護線程了, 則垃圾回收線程就會自動銷毀。
因此, 守護線程的作用就是為其他非守護線程的線程服務, 當非守護線程不存在時, 其自然就沒有存在的必要了。
如何創建
創建過程與一般的線程一樣, 只需要在創建完之後調用如下函數即可:
setDaemon(true);
判斷
public final boolean isDaemon() { return daemon; }
可以通過該函數判定一個線程是否為守護線程。
註意事項
函數setDaemon(true)必須在 start() 函數之前使用。
如 setDaemon(true) 在 start() 之後, 就會拋異常。如下
也就是說, 在線程運行之後, 其類型(守護與否)就已經確定了, 無法更改。
守護線程中產生的線程也是守護線程;
在 Thread 的 init() 函數中, 可以看到這麽一句:
this.daemon = parent.isDaemon();
測試
創建一個線程類
class PrimeThread extends Thread { @Override public void run() { System.out.println(Thread.currentThread().getName()+" begin"); try { int i = 0; while(true) { Thread.sleep(500); System.out.println("Current i = " + (i++)); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" end"); } }
創建測試方法
public static void main(String[] args) { PrimeThread primeThread = new PrimeThread(); primeThread.setDaemon(true); primeThread.start(); try { Thread.sleep(3000L); System.out.println("Main 函數準備結束了, 守護線程也機會停止, 不打印"); } catch (InterruptedException e) { e.printStackTrace(); } }
結果如下:
結果中, Main 函數的線程結束後, primeThread 線程也隨之結束了。
Java 多線程(四)之守護線程(Daemon)