文章首發自微信公衆號: 小哈學Javahtml
我的網站: https://www.exception.site/java-concurrency/java-concurrency-daemon-threadjava
目錄
1、什麼是守護線程git
2、守護線程的做用及應用場景github
3、總結面試
1、什麼是守護線程
守護線程相對於正常線程來講,是比較特殊的一類線程,那麼它特殊在哪裏呢?別急,在瞭解它以前,咱們須要知道一個問題,那就是:微信
JVM 程序在什麼狀況下可以正常退出?多線程
The Java Virtual Machine exits when the only threads running are all daemon threads.學習
上面這句話來自 JDK 官方文檔,意思是:網站
當 JVM 中不存在任何一個正在運行的非守護線程時,則 JVM 進程即會退出。spa
理解起來有點拗口,看完下面的代碼你就懂了 。^_^
- **①:**建立一個非守護線程;
- **②:**模擬非守護線程不退出的狀況;
- **③:**啓動線程;
- **④:**主線程即將退出;
運行這段代碼,猜猜看,JVM 進程是否可以正常退出呢?
能夠看到由於有一個非守護線程一直在後臺運行着,JVM 沒法正常退出。那麼,若是說正在運行的是個守護線程,結果又會怎麼樣呢?
- **①:**添加一個鉤子(Hook)線程, 用來監聽 JVM 退出,並輸出日誌;
關於 Hook (鉤子) 線程能夠看我以前的文章:《Java 多線程之 Hook (鉤子) 線程》
- **②:**經過
setDaemon(true)
將該線程爲守護線程;
再次運行代碼,瞅瞅效果:
能夠看到,當主線程退出時,JVM 會隨之退出運行,守護線程同時也會被回收,即便你裏面是個死循環也不礙事。
2、守護線程的做用及應用場景
經過上面的示例代碼,相信你已經瞭解了守護線程和普通線程之間的區別,那麼,咱們來討論一下爲何須要守護線程,以及什麼時候使用,它的應用場景是什麼?
上面,咱們已經知道了,若是 JVM 中沒有一個正在運行的非守護線程,這個時候,JVM 會退出。換句話說,守護線程擁有自動結束本身生命週期的特性,而非守護線程不具有這個特色。
JVM 中的垃圾回收線程就是典型的守護線程,若是說不具有該特性,會發生什麼呢?
當 JVM 要退出時,因爲垃圾回收線程還在運行着,致使程序沒法退出,這就很尷尬了!!!因而可知,守護線程的重要性了。
一般來講,守護線程常常被用來執行一些後臺任務,可是呢,你又但願在程序退出時,或者說 JVM 退出時,線程可以自動關閉,此時,守護線程是你的首選。
3、總結
本文中,咱們學習了什麼是守護線程,經過示例代碼瞭解了守護線程的特性,以及守護線程的做用,和應用場景。最後,若是看完此文有所收穫,不妨點個關注哈。
4、GitHub 示例源碼
https://github.com/weiwosuoai/java-concurrent-tutorial/tree/master/DaemonThread
贈送 | 面試&學習福利資源
最近在網上發現一個不錯的 PDF 資源《Java 核心面試知識.pdf》分享給你們,不光是面試,學習,你都值得擁有!!!
獲取方式: 關注公衆號: 小哈學Java, 後臺回覆 資源,既可獲取資源連接,下面是目錄以及部分截圖:
重要的事情說兩遍,獲取方式: 關注公衆號: 小哈學Java, 後臺回覆 資源,既可獲取資源連接 !!!
歡迎關注微信公衆號: 小哈學Java
原文出處:https://www.cnblogs.com/quanxiaoha/p/10731361.html