將線程轉換爲守護線程可以通過調用Thread對象的setDaemon(true)方法來實現。在使用守護線程時需要注意一下幾點:
(1) thread.setDaemon(true)必須在thread.start()之前設置,否則會跑出一個IllegalThreadStateException異常。你不能把正在運行的常規線程設置爲守護線程。
(2) 在Daemon線程中產生的新線程也是Daemon的。
(3) 守護線程應該永遠不去訪問固有資源,如文件、數據庫,因爲它會在任何時候甚至在一個操作的中間發生中斷。
守護線程等待所有用戶線程結束後才結束。
Demo:
public class DaemonSample {
static class DaemonThread extends Thread {
public String name;
public DaemonThread(String name){
this.name = name;
}
@Override
public void run() {
for(int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+"i=" + i);
}
}
}
public static void main(String[] args) {
Thread t1 = new DaemonThread("a");
t1.setDaemon(true);
Thread t2 = new DaemonThread("b");
t1.start();
t2.start();
}
}
結果:
bi=0
ai=0
bi=1
ai=1
........
ai=8
bi=8
bi=9
ai=9
如果註釋掉 t2.start();
結果:
這是爲什麼呢,此時的用戶線程只有主線程了,主線程結束了,那麼守護線程肯定也隨之結束了,連執行的機會都沒有。