并發-守護線程setDaemon()

目錄

為什么存在

什么是守護線程

創建守護線程

在使用守護線程時需要注意以下幾點

可以使用isDaemon()方法來檢查線程是否是守護線程

例1:上面提到當JVM中只剩下守護線程的時候,JVM就會退出,那么寫段代碼測試下

例2:thread是用戶線程,主線程結束后,thread會繼續運行

例3:thread是守護線程,主線程結束后,thread會隨即停止


為什么存在

  • Java程序入口就是由JVM啟動main線程,main線程又可以啟動其他線程
  • 當所有線程都運行結束時,JVM退出,進程結束
  • 如果有一個線程沒有退出,JVM進程就不會退出
  • 所以,必須保證所有線程都能及時結束
  • 但是有一種線程的目的就是無限循環
  • 例如,一個定時觸發任務的線程:
  • 如果這個線程不結束,JVM進程就無法結束
  • 問題是,由誰負責結束這個線程?
  • 然而這類線程經常沒有負責人來負責結束它們
  • 但是,當其他線程結束時,JVM進程又必須要結束,怎么辦?
  • 答案是使用守護線程(Daemon Thread)
  • 守護線程是指為其他線程服務的線程
  • 在JVM中,所有非守護線程都執行完畢后,無論有沒有守護線程,虛擬機都會自動退出
  • 因此,JVM退出時,不必關心守護線程是否已結束

什么是守護線程

  • 在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程)
  • 它們通過Thread的daemon屬性標識:true表示守護線程,false表示用戶線程
  • 用戶線程一般用于執行用戶級任務
  • 而守護線程也就是“后臺線程”,一般用來執行后臺任務
  • 并且這種線程并不屬于程序中不可或缺的部分
  • 因此,當所有的非守護線程結束時,程序也就終止了
  • 同時會殺死進程中的所有守護線程
  • 反過來說,只要任何非守護線程還在運行,程序就不會終止
  • 守護線程最典型的應用就是GC(垃圾回收器)
  • 這兩種線程其實是沒有什么區別的
  • 唯一的區別就是Java虛擬機在所有<用戶線程>都結束后就會退出,而不會等<守護線程>執行完
  • 當所有的非守護線程結束時,程序也就終止了
  • 因為沒有了被守護者,守護線程也就沒有工作可做了,也就沒有繼續運行程序的必要了
  • GC線程就是一個守護線程,保持低優先級進行垃圾回收,不依賴系統資源
  • 當所有用戶線程退出之后,GC線程也就沒有什么用了,會隨即退出
  • 因為如果沒有用戶線程了,也就代表沒有垃圾會繼續產生,也就不需要GC線程了
  • 可以簡單理解成守護線程為用戶線程服務,當所有用戶線程結束,也就不需要守護線程了

創建守護線程

  • 將線程轉換為守護線程可以通過調用Thread對象的setDaemon(true)方法來實現,使線程成為一個守護線程

在使用守護線程時需要注意以下幾點

  • 1-thread.setDaemon(true)必須在thread.start()之前設置,否則會拋出一個IllegalThreadStateException異常
  • 你不能把正在運行的常規線程設置為守護線程
  • 2-在Daemon線程中產生的新線程也是Daemon的
  • 3-守護線程應該永遠不去訪問固有資源,如文件、數據庫,因為它會在任何時候甚至在一個操作的中間發生中斷,這會導致數據丟失

可以使用isDaemon()方法來檢查線程是否是守護線程

  • 以上代碼輸出結果:

例1:上面提到當JVM中只剩下守護線程的時候,JVM就會退出,那么寫段代碼測試下

  • 以上代碼中,我們在Main線程中開啟了一個子線程
  • 在并沒有顯示將其設置為守護線程的情況下,他是一個用戶線程
  • 代碼比較好理解,就是子線程處于一個while(true)循環中,每隔一秒打印一次I'm child thread..
  • 輸出結果為:
  • 我們再把子線程設置成守護線程,重新運行以上代碼:
  • 以上代碼,我們通過childThread.setDaemon(true);把子線程設置成守護線程,然后運行,得到以下結果:
  • 子線程只打印了一次
  • 也就是在main線程執行結束后,由于子線程是一個守護線程,JVM就會直接退出了
  • 值得注意的是,在Daemon線程中產生的新線程也是Daemon的

例2:thread是用戶線程,主線程結束后,thread會繼續運行

例3:thread是守護線程,主線程結束后,thread會隨即停止

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10960.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10960.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10960.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小紅的字符串構造和小紅的排列構造

小紅的字符串構造 小紅希望你構造一個長度為nnn的、僅包含小寫字母的字符串&#xff0c;其中恰好有kkk個長度大于1的回文子串。你能幫幫她嗎&#xff1f;輸入兩個整數n,k&#xff0c;用空格隔開。 1≤n≤10^5,0≤k≤n/2.一個字符串。如果有多解輸出任意即可。 可以證明&#x…

[Bug]:由于中國防火墻,無法連接 huggingface.co

問題描述 : OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like youscan/ukr-roberta-base is not the path to a directory containing a file named config. Json. Checkout your internet …

[AIGC] 幾道 redis數據結構相關面試題

文章目錄 7. 數據類型的實現8. 什么是空間預分配以及惰性空間釋放&#xff0c;SDS 是怎么實現的9. 為什么說 SDS 是二進制安全的呢10. 說說 redis 里的對象11. 使用 RedisObject 的好處12. RedisObject 的具體結構是什么 7. 數據類型的實現 8. 什么是空間預分配以及惰性空間釋放…

Vue3實戰筆記(16)—pinia基本用法--Getter

文章目錄 前言一、pinia的getter簡單理解二、訪問其他 store 的 getter總結 前言 在 Pinia 中&#xff0c;getter 類似于 Vuex 中的 getter&#xff0c;允許你從 store 中派生出一些狀態&#xff0c;而不需要修改原始狀態。這使得我們可以創建基于現有狀態的計算屬性。 一、pi…

練習題(2024/5/12)

1二分查找 給定一個 n 個元素有序的&#xff08;升序&#xff09;整型數組 nums 和一個目標值 target &#xff0c;寫一個函數搜索 nums 中的 target&#xff0c;如果目標值存在返回下標&#xff0c;否則返回 -1。 示例 1: 輸入: nums [-1,0,3,5,9,12], target 9 輸出: 4…

樹莓派C語言開發

安裝C語言編譯器和開發工具 sudo apt update sudo apt install build-essential 此命令會安裝GCC編譯器以及make等其他工具&#xff0c;這些都是C語言程序開發過程中必需的。 配置文本編輯器 樹莓派默認安裝了幾個文本編輯器&#xff0c;如Nano和Vim。如果你對這些編輯器不熟…

如何遠程訪問?

遠程訪問是指在不同的地理位置之間通過網絡連接來實現對目標設備或系統的訪問。無論是在個人生活還是商業領域&#xff0c;遠程訪問都起到了重要的作用&#xff0c;幫助人們實現高效的工作和便捷的生活。本文將介紹一款名為【天聯】的組網產品&#xff0c;它是一款強大的異地組…

Linux與Windows互傳文件【筆記】

Linux與Windows互傳文件【筆記】 前言前言推薦Linux與Windows互傳文件首先確保Windows安裝ssh如何傳送文件問題 最后 前言 這是陳舊已久的草稿2023-05-10 00:01:24 這個是準備把計組課程華為智能計組的&#xff0c;傳輸文件。 最后發現&#xff0c;好像沒有實現了。 現在202…

汽車線控轉向系統介紹

汽車線控轉向系統由方向盤總成、轉向執行總成和主控制器(ECU)三個主要部分以及自動防故障系統、電源等輔助系統組成。 線控轉向系統(Steering-By-Wire)&#xff0c;取消了方向盤和轉向車輪之間的機械連接部件&#xff0c;徹底擺脫了機械固件的限制&#xff0c;完全由電能來實現…

【LeetCode】數組——hashmap的妙用

在遇到一類題目時&#xff0c;通過雙for循環也可暴力破解&#xff0c;但我們可以通過用hashmap來代替一次for循環節約時間開支&#xff0c;在算法上屬于用空間換時間&#xff0c;也能幫助我們更好的理解hashmap這一種重要數據結構&#xff0c;并熟悉hashmap的重要方法。 1.兩數…

31Windows精簡系統下載推薦

Windows精簡系統下載推薦 世界上有很多人在做Windows精簡系統&#xff0c;去掉了他們認為不必要的功能和插件&#xff0c;達到了減小系統安裝包體積&#xff0c;提升系統運行流暢度和穩定性的目的。 筆者推薦使用大佬不忘初心制作的精簡版系統&#xff0c;最精簡windows10系統安…

什么是數據平臺——企業構建Data+AI的基礎數據底座需要的決策參考

什么是數據平臺 標準的解釋是這樣的 Wikipedia A data platform usually refers to a software platform used for collecting and managing data, and acting as a data delivery point for application and reporting software. 數據平臺是指將各類數據進行整合、存儲、處…

你知道C++多少——默認成員函數

&#x1f308;個人主頁&#xff1a;小新_- &#x1f388;個人座右銘&#xff1a;“成功者不是從不失敗的人&#xff0c;而是從不放棄的人&#xff01;”&#x1f388; &#x1f381;歡迎各位→點贊&#x1f44d; 收藏?? 留言&#x1f4dd; &#x1f3c6;所屬專欄&#xff1…

Python vs MATLAB:選擇深度學習的首選編程語言

Python vs MATLAB&#xff1a;選擇深度學習的首選編程語言 在深度學習領域&#xff0c;編程語言的選擇對于初學者的學習路徑和未來的職業發展至關重要。目前&#xff0c;Python和MATLAB都是進行科學計算和數據分析的流行工具&#xff0c;但它們在深度學習社區中的應用和受歡迎…

linux程序分析命令(一)

linux程序分析命令(一) **ldd&#xff1a;**用于打印共享庫依賴。這個命令會顯示出一個可執行文件所依賴的所有共享庫&#xff08;動態鏈接庫&#xff09;&#xff0c;這對于解決運行時庫依賴問題非常有用。**nm&#xff1a;**用于列出對象文件的符號表。這個命令可以顯示出定…

什么事防抖和節流,有什么區別,如何實現

防抖和節流&#xff0c;本質上是優化高頻率執行代碼的一種手段&#xff0c;比如&#xff1a;resize、scroll、keypress、mousemove這些事件在觸發的時候&#xff0c;會不斷調用綁定在事件上的回調函數&#xff0c;這樣極大浪費資源&#xff0c;降低前端性能。 為了優化體驗&am…

ipa 分區算法分析,圖解

參考 Room Segmentation: Survey, Implementation, and Analysis. 分區算法調查&#xff0c;實現以及評估對比 相關論文 分區算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形態分割 Interactive SLAM using …

函數原型(Function Prototype)、函數定義(Function Definition)和函數聲明(Function Declaration)

函數原型&#xff08;Function Prototype&#xff09;、函數定義&#xff08;Function Definition&#xff09;和函數聲明&#xff08;Function Declaration&#xff09;在C和C等編程語言中扮演著不同的角色&#xff0c;但它們有時在概念上可能會有些重疊。下面是它們之間的主要…

NOR FLASH介紹

參考 http://t.csdnimg.cn/gHcrG 一、NOR FLASH簡介 XIP技術:https://blog.csdn.net/ffdia/article/details/87437872?fromshareblogdetail NOR Flash 和 NAND Flash 的特點和應用舉例&#xff1a; NOR Flash&#xff1a; 特點&#xff1a; 支持隨機訪問&#xff0c;可以直接…

QT作業4

1、思維導圖 2、使用定時器完成鬧鐘 頭文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> #include <QLabel> #include <QPushButton> #include <QTextEdit> #include <QDebug> #include <…