前言
守護線程(即daemon thread),是個服務線程,准確地來說就是服務其他的線程,這是它的作用——而其他的線程只有一種,那就是用戶線程。所以java里線程分2種,
1、守護線程,比如垃圾回收線程,就是最典型的守護線程。
2、用戶線程,就是應用程序里的自定義線程。
守護線程
1、守護線程,專門用於服務其他的線程,如果其他的線程(即用戶自定義線程)都執行完畢,連main線程也執行完畢,那么jvm就會退出(即停止運行)——此時,連jvm都停止運行了,守護線程當然也就停止執行了。
2、再換一種說法,如果有用戶自定義線程存在的話,jvm就不會退出——此時,守護線程也不能退出,也就是它還要運行,干嘛呢,就是為了執行垃圾回收的任務啊。
3、守護線程又被稱為“服務進程”“精靈線程”“后台線程”,是指在程序運行是在后台提供一種通用的線程,這種線程並不屬於程序不可或缺的部分。 通俗點講,任何一個守護線程都是整個JVM中所有非守護線程的“保姆”。
用戶自定義線程
1、應用程序里的線程,一般都是用戶自定義線程。
2、用戶也可以在應用程序代碼自定義守護線程,只需要調用Thread類的設置方法設置一下即可。
3、用戶線程和守護線程幾乎一樣,唯一的不同之處就在於如果用戶線程已經全部退出運行,只剩下守護線程存在了,JVM也就退出了。 因為當所有非守護線程結束時,沒有了被守護者,守護線程也就沒有工作可做了,也就沒有繼續運行程序的必要了,程序也就終止了,同時會“殺死”所有守護線程。 也就是說,只要有任何非守護線程還在運行,程序就不會終止。
在Java語言中,守護線程一般具有較低的優先級,它並非只由JVM內部提供,用戶在編寫程序時也可以自己設置守護線程,例如將一個用戶線程設置為守護線程的方法就是在調用start()方法啟動線程之前調用對象的setDaemon(true)方法,若將以上括號里的參數設置為false,則表示的是用戶進程模式。
需要注意的是,當在一個守護線程中產生了其它線程,那么這些新產生的線程默認還是守護線程,用戶線程也是如此。