守護線程
提示:更多優秀博文請移步博主的GitHub倉庫:GitHub學習筆記、Gitee學習筆記
在Java中有兩類線程:用戶線程(User Thread)、守護線程(Daemon Thread)
用個比較通俗的比喻,任何一個守護線程都是整個JVM中所有非守護線程的保姆:
只要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就全部工作;只有當最后一個非守護線程結束時,守護線程隨著JVM一同結束工作。
Daemon的作用是為其他線程的運行提供便利服務,守護線程最典型的應用就是 GC (垃圾回收器),它就是一個很稱職的守護者。
User和Daemon兩者幾乎沒有區別,唯一的不同之處就在于虛擬機的離開:如果 User Thread已經全部退出運行了,只剩下Daemon Thread存在了,虛擬機也就退出了。 因為沒有了被守護者,Daemon也就沒有工作可做了,也就沒有繼續運行程序的必要了。
值得一提的是,守護線程并非只有虛擬機內部提供,用戶在編寫程序時也可以自己設置守護線程。下面的方法就是用來設置守護線程的。
public class Test {
public static void main(String[] args) throws InterruptedException {
DeamonRunnable deamonRunnable = new DeamonRunnable();
Thread thread = new Thread(deamonRunnable);
thread.setDaemon(true);//將thread設置為守護線程
thread.start();
Thread.sleep(10);
}
}
需要注意的是:
- thread.setDaemon(true)必須在thread.start()之前設置,否則會跑出一個IllegalThreadStateException異常。你不能把正在運行的常規線程設置為守護線程。
- 在Daemon線程中產生的新線程也是Daemon的。
- 守護線程的優先級是最低的。
- 不要認為所有的應用都可以分配給Daemon來進行服務,比如讀寫操作或者計算邏輯。
因為守護進程是隨著虛擬機的停止而停止運行的,你不可能預料到虛擬機何時停止,而如果在守護線程擁有類似finally代碼塊的語句,那么這些語句很有可能沒有機會運行。
文章參考:http://www.rzrgm.cn/ziq711/p/8228255.html

浙公網安備 33010602011771號