最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java守護(hù)線程Daemon原理+實(shí)戰(zhàn)完全解析(徹底搞懂后臺(tái)線程設(shè)計(jì))

 更新時(shí)間:2026年07月18日 10:19:36   作者:暗暗別做白日夢(mèng)  
Daemon線程是一種支持性線程,因?yàn)樗饕米鞒绦蛑信_(tái)調(diào)度以及支持性工作,這篇文章主要介紹了Java守護(hù)線程Daemon原理及實(shí)戰(zhàn)完全解析的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、先講單詞:Daemon 到底是什么意思?

1. 發(fā)音與拼寫(xiě)

Daemon /?di?m?n/(和 Demon 讀音一樣,但含義完全不同

2. 原始含義(古希臘語(yǔ))

  • Daemon守護(hù)神、精靈、半神中性 / 褒義的,指默默守護(hù)、輔助人類的靈體;
  • Demon:惡魔、惡鬼(貶義)? 計(jì)算機(jī)里用的是 Daemon(守護(hù)神),不是惡魔!

3. 核心翻譯

Daemon = 守護(hù)神 / 后臺(tái)守護(hù)者

二、為什么 Java 里叫「守護(hù)線程」?

1. 技術(shù)傳承(Unix 系統(tǒng)起源)

Daemon 最早是 Unix/Linux 系統(tǒng)的術(shù)語(yǔ):

  • 系統(tǒng)后臺(tái)默默運(yùn)行的服務(wù)進(jìn)程,叫 Daemon 進(jìn)程(守護(hù)進(jìn)程)比如:MySQL 服務(wù)、Nginx 服務(wù)、后臺(tái)日志服務(wù)
  • 特點(diǎn):不跟用戶交互、在后臺(tái)默默運(yùn)行、守護(hù)系統(tǒng)正常工作

Java 語(yǔ)言直接沿用了這個(gè)概念:

  • 后臺(tái)默默輔助的線程 → Daemon Thread(守護(hù)線程)

2. 功能完全匹配「守護(hù)」二字

這個(gè)線程的行為,和 「守護(hù)神」一模一樣:

  1. 默默干活:在后臺(tái)運(yùn)行,不干擾主線程(用戶線程)
  2. 依附主人:主線程(業(yè)務(wù)線程)活著,它就干活
  3. 主人退場(chǎng),它立刻消失:主線程關(guān)閉,它不拖累程序
  4. 只做輔助:為核心業(yè)務(wù)提供支持,不搶主角

三、結(jié)合代碼,一秒理解

訂單超時(shí)監(jiān)聽(tīng)線程:

thread.setDaemon(true); 

這個(gè)線程就是訂單服務(wù)的守護(hù)神

  • 服務(wù)運(yùn)行 → 它默默守護(hù),監(jiān)聽(tīng)超時(shí)訂單
  • 服務(wù)關(guān)閉 → 它立刻消失,不阻礙程序退出
  • 只做輔助,不影響核心業(yè)務(wù)

完美對(duì)應(yīng) Daemon(守護(hù)神)的含義!

四、極簡(jiǎn)總結(jié)(終身不忘)

  1. Daemon 本意守護(hù)神、后臺(tái)守護(hù)者(不是惡魔!)
  2. 技術(shù)起源:Unix 后臺(tái)服務(wù)叫守護(hù)進(jìn)程,Java 沿用
  3. 為什么叫守護(hù)線程:它在后臺(tái)默默守護(hù)主線程,主人在它在,主人走它走,純輔助、不添亂

如果不加thread.setDaemon(true),默認(rèn)創(chuàng)建的是:用戶線程

一、什么是守護(hù)線程?

Java 中的線程分為兩大類,地位完全不同:

  1. 用戶線程(User Thread)也叫非守護(hù)線程,是程序的核心工作線程。比如:Spring 主線程、HTTP 請(qǐng)求處理線程、我們編寫(xiě)的業(yè)務(wù)邏輯線程。    ? JVM(Java 虛擬機(jī))會(huì)等待所有用戶線程執(zhí)行完畢,才會(huì)退出。

  2. 守護(hù)線程(Daemon Thread)也叫后臺(tái)服務(wù)線程,是為用戶線程提供輔助服務(wù)的線程。比如:GC 垃圾回收線程、我們的訂單超時(shí)監(jiān)聽(tīng)線程。? JVM 不會(huì)等待守護(hù)線程,當(dāng)所有用戶線程結(jié)束時(shí),守護(hù)線程會(huì)被強(qiáng)制立即終止

一句話總結(jié)

用戶線程是主人,守護(hù)線程是仆人;主人下班(程序關(guān)閉),仆人立刻下崗,絕不拖延!

二、核心特性

守護(hù)線程有兩個(gè)不可違背的特性,是設(shè)計(jì)的核心:

  1. 依附性:守護(hù)線程的生命周期完全依賴用戶線程,用戶線程全部退出,守護(hù)線程自動(dòng)銷毀;
  2. 低優(yōu)先級(jí):默認(rèn)優(yōu)先級(jí)較低,僅在后臺(tái)默默提供輔助服務(wù),不影響核心業(yè)務(wù)。

三、實(shí)戰(zhàn)場(chǎng)景:訂單超時(shí)消費(fèi)者為什么用守護(hù)線程?

回到業(yè)務(wù)代碼:訂單支付超時(shí)監(jiān)聽(tīng)線程這個(gè)線程需要24 小時(shí)死循環(huán)監(jiān)聽(tīng) Redis 阻塞隊(duì)列,處理超時(shí)訂單。

@PostConstruct
public void start() {
    executorService = Executors.newSingleThreadExecutor(r -> {
        // 創(chuàng)建后臺(tái)監(jiān)聽(tīng)線程
        Thread thread = new Thread(r, "order-payment-timeout-consumer");
        // 核心:設(shè)置為守護(hù)線程
        thread.setDaemon(true);  
        return thread;
    });
    // 啟動(dòng)循環(huán)監(jiān)聽(tīng)
    executorService.submit(this::consumeLoop);
}

為什么要給這個(gè)線程設(shè)置setDaemon(true)?

我們的監(jiān)聽(tīng)線程是純后臺(tái)輔助線程,它的唯一作用是服務(wù)訂單業(yè)務(wù):

  • 服務(wù)運(yùn)行時(shí):正常監(jiān)聽(tīng)、處理超時(shí)訂單;
  • 服務(wù)關(guān)閉時(shí):必須立刻停止,不能阻礙程序退出。

四、不設(shè)置守護(hù)線程的嚴(yán)重后果

如果刪掉 thread.setDaemon(true),會(huì)發(fā)生生產(chǎn)級(jí) BUG

  1. 你停止 Spring 服務(wù)(執(zhí)行關(guān)閉命令);
  2. 所有用戶線程都已退出;
  3. 但你的訂單監(jiān)聽(tīng)線程是用戶線程,還在死循環(huán)運(yùn)行;
  4. JVM 會(huì)一直等待這個(gè)線程結(jié)束,無(wú)法正常退出;
  5. 最終導(dǎo)致:服務(wù)器進(jìn)程殘留、端口占用、服務(wù)無(wú)法重啟。

通俗比喻

  • 設(shè)置守護(hù)線程:臨時(shí)工保安,老板下班,保安立刻走;
  • 不設(shè)置守護(hù)線程:正式工保安,老板下班了,保安還死守崗位,公司大門關(guān)不上。

五、守護(hù)線程使用注意事項(xiàng)

守護(hù)線程不能用來(lái)執(zhí)行重要的、不可中斷的業(yè)務(wù),因?yàn)樗鼤?huì)被 JVM 強(qiáng)制殺死,沒(méi)有任何收尾機(jī)會(huì)。

禁忌場(chǎng)景

  1. ? 不要在守護(hù)線程中做:數(shù)據(jù)庫(kù)事務(wù)提交、文件寫(xiě)入、數(shù)據(jù)持久化;
  2. ? 不要在守護(hù)線程中做:需要保證執(zhí)行完成的核心邏輯;

適用場(chǎng)景

  1. ? 后臺(tái)監(jiān)聽(tīng)、定時(shí)掃描(如我們的訂單超時(shí)監(jiān)聽(tīng));
  2. ? 日志收集、監(jiān)控上報(bào);
  3. ? JVM 垃圾回收(GC);
  4. ? 心跳檢測(cè)、后臺(tái)清理。

我們的訂單超時(shí)線程:只是從 Redis 取任務(wù)、執(zhí)行業(yè)務(wù),被強(qiáng)制終止也不會(huì)造成數(shù)據(jù)問(wèn)題,完美適配守護(hù)線程。

六、關(guān)鍵知識(shí)點(diǎn)補(bǔ)充

  1. 守護(hù)線程的繼承性如果一個(gè)線程是守護(hù)線程,它創(chuàng)建的子線程默認(rèn)也是守護(hù)線程;用戶線程創(chuàng)建的子線程,默認(rèn)是用戶線程。

  2. 設(shè)置時(shí)機(jī)setDaemon(true) 必須在線程啟動(dòng)前設(shè)置,線程運(yùn)行后設(shè)置會(huì)直接報(bào)錯(cuò)!

七、總結(jié)

核心結(jié)論

  1. Daemon = 守護(hù)線程,是為用戶線程服務(wù)的后臺(tái)輔助線程;
  2. 主人(用戶線程)退出,仆人(守護(hù)線程)強(qiáng)制終止;
  3. 我們的訂單超時(shí)監(jiān)聽(tīng)線程設(shè)置為守護(hù)線程,是為了服務(wù)關(guān)閉時(shí)線程自動(dòng)銷毀,避免 JVM 無(wú)法退出;
  4. 這是 Java 后臺(tái)線程設(shè)計(jì)的標(biāo)準(zhǔn)最佳實(shí)踐。

一句話記憶

守護(hù)線程,隨程序生,隨程序死;不拖后腿,不占資源,后臺(tái)服務(wù)的最佳選擇!

適用場(chǎng)景:分布式定時(shí)任務(wù)、延遲隊(duì)列監(jiān)聽(tīng)、后臺(tái)掃描、輔助服務(wù)線程核心作用:保證服務(wù)優(yōu)雅啟停,避免進(jìn)程殘留

到此這篇關(guān)于Java守護(hù)線程Daemon原理+實(shí)戰(zhàn)完全解析的文章就介紹到這了,更多相關(guān)Java守護(hù)線程Daemon內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的BigDecimal使用問(wèn)題小結(jié)

    Java中的BigDecimal使用問(wèn)題小結(jié)

    BigDecimal 是 Java 中用于進(jìn)行精確十進(jìn)制計(jì)算的重要類, 它適用于金融、科學(xué)等需要高精度計(jì)算的場(chǎng)景,這篇文章讓我來(lái)詳細(xì)講解 Java 中的 BigDecimal 類,包括它的用途、適用場(chǎng)景、以及潛在問(wèn)題,感興趣的朋友一起看看吧
    2025-04-04
  • Java 如何優(yōu)雅的拋出業(yè)務(wù)異常

    Java 如何優(yōu)雅的拋出業(yè)務(wù)異常

    這篇文章主要介紹了Java 如何優(yōu)雅的拋出業(yè)務(wù)異常,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Java經(jīng)典排序算法之快速排序代碼實(shí)例

    Java經(jīng)典排序算法之快速排序代碼實(shí)例

    這篇文章主要介紹了Java經(jīng)典排序算法之快速排序代碼實(shí)例,快速排序?qū)崿F(xiàn)的思想是指通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,需要的朋友可以參考下
    2023-10-10
  • 如何使用java制作假數(shù)據(jù)接口

    如何使用java制作假數(shù)據(jù)接口

    這篇文章主要介紹了如何使用java制作假數(shù)據(jù)接口,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Springcloud之Gateway組件詳解

    Springcloud之Gateway組件詳解

    Spring Cloud Gateway是Spring Cloud微服務(wù)生態(tài)下的網(wǎng)關(guān)組件。Spring Cloud Gateway是基于Spring 5和Spring Boot 2搭建的,本質(zhì)上是一個(gè)Spring Boot應(yīng)用。本文詳細(xì)介紹了SpringCloud的網(wǎng)關(guān)組件 Gateway,,需要的朋友可以參考下
    2023-05-05
  • 深入解析HashMap的put方法

    深入解析HashMap的put方法

    在Java集合中,HashMap的重要性不言而喻,作為一種存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),它在日常開(kāi)發(fā)中有著非常多的應(yīng)用場(chǎng)景,也是面試中的高頻考點(diǎn),本篇文章就來(lái)分析一下HashMap集合中的put方法
    2022-01-01
  • Java中的System類、BigInteger類和BigDecimal類詳解

    Java中的System類、BigInteger類和BigDecimal類詳解

    這篇文章主要介紹了Java中的System類、BigInteger類和BigDecimal類詳解,arraycopy()方法,復(fù)制數(shù)組元素,比較適合底層調(diào)用,一般使用Arrays.copyOf()完成復(fù)制數(shù)組,需要的朋友可以參考下
    2023-09-09
  • Java中Redis的布隆過(guò)濾器詳解

    Java中Redis的布隆過(guò)濾器詳解

    這篇文章主要介紹了Java中Redis的布隆過(guò)濾器詳解,我們經(jīng)常會(huì)把一部分?jǐn)?shù)據(jù)放在Redis等緩存,比如產(chǎn)品詳情,這樣有查詢請(qǐng)求進(jìn)來(lái),我們可以根據(jù)產(chǎn)品Id直接去緩存中取數(shù)據(jù),而不用讀取數(shù)據(jù)庫(kù),這是提升性能最簡(jiǎn)單,最普遍,也是最有效的做法,需要的朋友可以參考下
    2023-09-09
  • Java如何獲得泛型類中的泛型類型T.class

    Java如何獲得泛型類中的泛型類型T.class

    獲取泛型符號(hào)E的Class對(duì)象的方法,1.反射方案利用匿名子類實(shí)例化,但該方法有特殊限制,2.反射方案2直接指定泛型類型,但不靈活,3.構(gòu)造方法方案在初始化時(shí)傳入泛型類,但有寫(xiě)錯(cuò)風(fēng)險(xiǎn)
    2024-12-12
  • java簡(jiǎn)單自定義異常實(shí)例代碼

    java簡(jiǎn)單自定義異常實(shí)例代碼

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單自定義異常實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11

最新評(píng)論

屯留县| 梁河县| 新巴尔虎左旗| 龙陵县| 横山县| 泰顺县| 东乡县| 大荔县| 海林市| 三河市| 蒙阴县| 广安市| 博客| 永春县| 杂多县| 镇江市| 舞阳县| 云龙县| 扎赉特旗| 通河县| 清徐县| 长子县| 白玉县| 西昌市| 东海县| 武功县| 贵定县| 利津县| 静安区| 永仁县| 通化市| 怀仁县| 济宁市| 扶沟县| 杭锦后旗| 常州市| 蓬安县| 修武县| 泰州市| 东源县| 公主岭市|