java中的守護線程

daemon
守護線程–也稱“服務線程”,在沒有用戶線程可服務時會自動離開。
優先級:守護線程的優先級比較低,用於爲系統中的其它對象和線程提供服務。

Java中JVM存在兩類線程:
	User Thread(用戶線程)、
	Daemon Thread(守護線程)

所謂的守護線程,是指用戶程序在運行的時候後臺提供的一種通用服務的線程,比如用於垃圾回收的
垃圾回收線程。這類線程並不是用戶線程不可或缺的部分,只是用於提供服務的"服務線程"。
基於這個特點,當虛擬機中的用戶線程全部退出運行時,守護線程沒有服務的對象後,JVM也就退出了。

守護線程典型應用:[gc]
垃圾回收線程就是一個經典的守護線程,當我們的程序中不再有任何運行的Thread,程序就不會再產生垃圾,
垃圾回收器也就無事可做,所以當垃圾回收線程是JVM上僅剩的線程時,垃圾回收線程會自動離開。它始終在
低級別的狀態中運行,用於實時監控和管理系統中的可回收資源。

用戶線程和守護線程的區別
       User和Daemon兩者幾乎沒有區別,唯一的不同之處就在於虛擬機的離開:如果 User Thread已經全部退出運行了,只剩下Daemon Thread存在了,虛擬機也就退出了。 因爲沒有了被守護者,Daemon也就沒有工作可做了,也就沒有繼續運行程序的必要了。
即:當線程中只剩下守護線程時JVM就會退出,反之還有任意一個用戶線程在,JVM都不會退出。
值得一提的是,守護線程並非只有虛擬機內部提供,用戶在編寫程序時也可以自己設置守護線程
設置:通過setDaemon(true)來設置線程爲“守護線程”;將一個用戶線程設置爲
守護線程的方式是在 線程對象創建 之前 用線程對象的setDaemon方法。如下:

Thread daemonTread = new Thread();
  // 設定 daemonThread 爲 守護線程,default false(非守護線程)  
 daemonThread.setDaemon(true);
 // 驗證當前線程是否爲守護線程,返回 true 則爲守護線程  
 daemonThread.isDaemon();  

使用守護線程應該注意的問題:
1、thread.setDaemon(true)必須在thread.start()之前設置,否則會跑出一個異常。你不能把正在運行的常規線程設置爲守護線程。
2、在守護線程中產生的線程也是守護線程。
3、我們自己產生的守護線程應該避免訪問一些類似於文件、數據庫等固有資源,因爲由於JVM沒有用戶線程之後,守護線程會馬上終止。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章