文章首發自微信公眾號: 小哈學Java
個人網站: https://www.exception.site/java-concurrency/java-concurrency-daemon-thread
目錄
一、什么是守護線程
二、守護線程的作用及應用場景
三、總結
一、什么是守護線程
守護線程相對於正常線程來說,是比較特殊的一類線程,那么它特殊在哪里呢?別急,在了解它之前,我們需要知道一個問題,那就是:
JVM 程序在什么情況下能夠正常退出?
The Java Virtual Machine exits when the only threads running are all daemon threads.
上面這句話來自 JDK 官方文檔,意思是:
當 JVM 中不存在任何一個正在運行的非守護線程時,則 JVM 進程即會退出。
理解起來有點拗口,看完下面的代碼你就懂了 。_
- ①:創建一個非守護線程;
- ②:模擬非守護線程不退出的情況;
- ③:啟動線程;
- ④:主線程即將退出;
運行這段代碼,猜猜看,JVM 進程是否能夠正常退出呢?
可以看到因為有一個非守護線程一直在后台運行着,JVM 無法正常退出。那么,如果說正在運行的是個守護線程,結果又會怎么樣呢?
- ①:添加一個鈎子(Hook)線程, 用來監聽 JVM 退出,並輸出日志;
關於 Hook (鈎子) 線程可以看我之前的文章:《Java 多線程之 Hook (鈎子) 線程》
- ②:通過
setDaemon(true)
將該線程為守護線程;
再次運行代碼,瞅瞅效果:
可以看到,當主線程退出時,JVM 會隨之退出運行,守護線程同時也會被回收,即使你里面是個死循環也不礙事。
二、守護線程的作用及應用場景
通過上面的示例代碼,相信你已經了解了守護線程和普通線程之間的區別,那么,我們來討論一下為什么需要守護線程,以及何時使用,它的應用場景是什么?
上面,我們已經知道了,如果 JVM 中沒有一個正在運行的非守護線程,這個時候,JVM 會退出。換句話說,守護線程擁有自動結束自己生命周期的特性,而非守護線程不具備這個特點。
JVM 中的垃圾回收線程就是典型的守護線程,如果說不具備該特性,會發生什么呢?
當 JVM 要退出時,由於垃圾回收線程還在運行着,導致程序無法退出,這就很尷尬了!!!由此可見,守護線程的重要性了。
通常來說,守護線程經常被用來執行一些后台任務,但是呢,你又希望在程序退出時,或者說 JVM 退出時,線程能夠自動關閉,此時,守護線程是你的首選。
三、總結
本文中,我們學習了什么是守護線程,通過示例代碼了解了守護線程的特性,以及守護線程的作用,和應用場景。最后,如果看完此文有所收獲,不妨點個關注哈。
四、GitHub 示例源碼
https://github.com/weiwosuoai/java-concurrent-tutorial/tree/master/DaemonThread
贈送 | 面試&學習福利資源
最近在網上發現一個不錯的 PDF 資源《Java 核心面試知識.pdf》分享給大家,不光是面試,學習,你都值得擁有!!!
獲取方式: 關注公眾號: 小哈學Java, 后台回復 資源,既可獲取資源鏈接,下面是目錄以及部分截圖:
重要的事情說兩遍,獲取方式: 關注公眾號: 小哈學Java, 后台回復 資源,既可獲取資源鏈接 !!!