守護線程與普通線程的唯一區別是:當JVM中所有的線程都是守護線程的時候,JVM就可以退出了;如果還有一個或以上的非守護線程則不會退出。(以上是針對正常退出,調用System.exit則必定會退出)
所以setDeamon(true)的唯一意義就是告訴JVM不需要等待它退出,讓JVM喜歡什麼退出就退出吧,不用管它。
守護線程在沒有用戶線程可服務時自動離開,在Java中比較特殊的線程是被稱爲守護(Daemon)線程的低級別線程。這個線程具有最低的優先級,用於爲系統中的其它對象和線程提供服務。將一個用戶線程設置爲守護線程的方式是在線程對象創建之前調用線程對象的setDaemon方法。典型的守護線程例子是JVM中的系統資源自動回收線程,我們所熟悉的Java垃圾回收線程就是一個典型的守護線程,當我們的程序中不再有任何運行中的Thread,程序就不會再產生垃圾,垃圾回收器也就無事可做,所以當垃圾回收線程是Java虛擬機上僅剩的線程時,Java虛擬機會自動離開。它始終在低級別的狀態中運行,用於實時監控和管理系統中的可回收資源。守護進程(Daemon)是運行在後臺的一種特殊進程。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。也就是說守護線程不依賴於終端,但是依賴於系統,與系統“同生共死”。那Java的守護線程是什麼樣子的呢。當JVM中所有的線程都是守護線程的時候,JVM就可以退出了;如果還有一個或以上的非守護線程則JVM不會退出。
package com.business.thread;
/*守護線程,finally快的內容不一定會執行*/
public class DaemonThread {
private static class useThread extends Thread{
public void run() {
try {
while(!isInterrupted()) {
System.out.println(Thread.currentThread().getName());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
System.out.println("finally");
}
}
}
public static void main(String[] args) {
useThread thread = new useThread();
//設置守護線程要在start之前
thread.setDaemon(true);
thread.start();
}
}