面試官: 談談什么是守護線程以及作用 ?


文章首發自微信公眾號: 小哈學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, 后台回復 資源,既可獲取資源鏈接 !!!

歡迎關注微信公眾號: 小哈學Java

小哈學Java


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM