在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是守護線程?守護線程的底層原理和使用示例

CodeSheep ? 來源:飛天小牛肉 ? 2024-01-05 11:01 ? 次閱讀

大家好,今天這篇文章來梳理一下有關守護線程的相關問題,這也是之前曾經有被問到過的面試題,在此之前我們先看一看守護線程的使用示例。

守護線程使用示例

我們先來看看下面這段代碼:

5ef8c72a-ab66-11ee-8b88-92fbcf53809c.png

在上面的示例中,我們創建了一個守護線程daemonThread,并將其設置為守護線程。

主線程休眠一段時間后,主線程結束,程序退出,此時守護線程也會隨之結束。守護線程的DaemonTask會不斷地輸出消息,模擬后臺任務的執行。

當主線程結束后,你會注意到守護線程DaemonTask不再輸出消息,因為它被 JVM 中止了。

什么是守護線程

Java 把線程分成兩類:用戶線程(User Thread) + 守護線程(Daemon Thread)

守護線程的使用有以下要點:

當程序中所有的用戶線程執行完畢之后,不管守護線程是否結束,系統都會自動退出(也就是說只要存在一個用戶線程在允許,守護線程就不會結束)

守護線程必須在start啟動前通過setDaemon()方法將狀態設置為 true,啟動后就不能進行設置,否則報 InterruptedException 異常

守護線程存在被 JVM 強制終止的風險,所以在守護線程中盡量不去訪問系統資源,例如打開文件等,因為虛擬機退出時,守護線程沒有任何機會來關閉文件,這會導致數據丟失,所以守護線程適合執行無需完整執行的后臺任務。

守護線程中創建的線程也是守護線程

JVM 進程中的 GC 線程就是一個守護線程,這樣設計目的很明確,當你所有的程序都執行完畢了,留著這個 GC 線程就沒有任何意義了。反過來可以設想,如果把 GC 線程設計成非守護線程,當你明確你的程序都執行完畢了,但是就是不自動退出豈不是很奇怪?

守護線程的底層原理

守護線程底層原理是啥?為什么用戶線程結束守護線程就能自動退出?(相信很多很多小伙伴遇到這個題都會直接懵,屬于低頻但重點的考點)

我們看下 JVM 源碼thread.cpp文件,這里是實現線程的代碼。可以盲猜有一段代碼監測著當前非守護線程的數量,不然怎么知道現在只剩下守護線程呢?很有可能是在移除線程的方法里面,跟著這個思路,我們看看該文件的remove()方法。代碼如下

5f164fd4-ab66-11ee-8b88-92fbcf53809c.png

我在里面加了一些注釋,可以發現,果然是我們想的那樣,里面有_number_of_non_daemon_threads記錄著非守護線程的數量,而且當非守護線程數為 1 時,就會喚醒在destory_vm()方法里面等待的線程,緊接著我們看看destory_vm()代碼,同樣是在thread.cpp文件下:

5f3a45b0-ab66-11ee-8b88-92fbcf53809c.png

可以看到當非守護線程數量大于 1 時,就一直等待,直到剩下一個非守護線程時,就會在線程執行完后,退出 JVM。

這時候又有一個點需要搞清楚,就是什么時候調用的destroy_vm()方法呢?還是通過查看代碼以及注釋,發現是在main()方法執行完成后觸發的。

在java.c文件的JavaMain()方法里面,最后執行完調用了LEAVE()方法,該方法調用了(*vm)->DestroyJavaVM(vm);來觸發 JVM 退出,最終調用destroy_vm()方法。

5f4b2e8e-ab66-11ee-8b88-92fbcf53809c.png

總結下就是:Java 程序在 main 線程執行退出時,會觸發執行 JVM 退出操作(destroy_vm()方法),但是該方法會等待所有非守護線程(用戶線程)都執行完,具體原理是使用變量_number_of_non_daemon_threads統計非守護線程的數量,這個變量在新增線程和刪除線程時會做增減操作。

另外衍生一點就是:當 JVM 退出時,所有還存在的守護線程會被拋棄,既不會執行 finally 部分代碼,也不會 catch 異常。這個很明顯,JVM 都退出了,守護線程也就不能獨自存在了。

好了,以上就是今天的內容分享,感謝大家的收看,我們下篇見。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    2982

    瀏覽量

    106391
  • 代碼
    +關注

    關注

    30

    文章

    4871

    瀏覽量

    69909
  • JVM
    JVM
    +關注

    關注

    0

    文章

    159

    瀏覽量

    12444
  • 線程
    +關注

    關注

    0

    文章

    507

    瀏覽量

    19990

原文標題:京東一面:守護線程如何實現的?

文章出處:【微信號:CodeSheep,微信公眾號:CodeSheep】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux守護進程

    這里將上一個示例程序用syslog服務進行重寫,其中有區別的地方用加粗的字體表示,源代碼如下: /* syslog_daemon.c利用syslog服務的守護進程實例 */ #include
    發表于 08-22 09:17

    Linux多線程線程間同步

    、是否為守護進程等。可以使用NULL來使用默認值,通常情況下我們都是使用默認值。void *(*func) (void *):函數指針func,指定當新的線程創建之后,將執行的函數。void *arg
    發表于 12-08 14:14

    Java守護線程和本地線程的區別

    java中的線程分為兩種:守護線程(Daemon)和用戶線程(User)。
    發表于 08-07 08:10

    線程編程之Linux線程編程

    9.2 Linux線程編程 9.2.1 線程基本編程 這里要講的線程相關操作都是用戶空間中的線程的操作。在Linux中,一般pthread線程
    發表于 10-18 15:55 ?3次下載

    線程好還是單線程好?單線程和多線程的區別 優缺點分析

    摘要:如今單線程與多線程已經得到普遍運用,那么到底多線程好還是單線程好呢?單線程和多線程的區別又
    發表于 12-08 09:33 ?8.2w次閱讀

    Jvm工作原理學習筆記

    [] args)函數的class都可以作為JVM實例運行的起點 b) 運行。main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。JVM內部有兩種線程
    發表于 04-03 11:03 ?5次下載

    C#多線程技術

    C#和.NET類庫為開發多線程應用程序提供了很方便的支持,本章首先簡要介紹.NET類庫中的Thread類及各種線程支持,再通過示例說明線程使用中需要掌握的規則,最后論述
    發表于 04-23 11:32 ?15次下載

    Linux的C編程中多線程如何終止某個線程示例與要點

    線程被另一個線程通過 pthread_cancel() 函數取消,這和通過kill() 發送 SIGKILL 信號類似。
    的頭像 發表于 04-27 13:41 ?3568次閱讀
    Linux的C編程中多<b class='flag-5'>線程</b>如何終止某個<b class='flag-5'>線程</b><b class='flag-5'>示例</b>與要點

    MFC多線程線程同步

    MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區別在于工作者線程沒有消息循環,而用戶界面線程有自己的消息隊列和消息循環。
    發表于 06-01 17:03 ?0次下載

    為什么說線程是輕量級的概念呢?守護線程是指什么?

    當多個線程同時搶多把鎖的時候就會出現死鎖的現象。其實遞歸鎖也不是一個很好地解決方案,死鎖現象的發生不是互斥鎖的原因,而是程序猿/媛的邏輯出現了問題。
    的頭像 發表于 08-19 10:39 ?2236次閱讀
    為什么說<b class='flag-5'>線程</b>是輕量級的概念呢?<b class='flag-5'>守護</b><b class='flag-5'>線程</b>是指什么?

    什么是線程線程池中線程實現復用的原理

    一般建議自定義線程工廠,構建線程的時候設置線程的名稱,這樣就在查日志的時候就方便知道是哪個線程執行的代碼。
    發表于 01-29 13:44 ?1862次閱讀

    線程線程

    線程池通常用于服務器應用程序。 每個傳入請求都將分配給線程池中的一個線程,因此可以異步處理請求,而不會占用主線程,也不會延遲后續請求的處理
    的頭像 發表于 02-28 09:53 ?938次閱讀
    多<b class='flag-5'>線程</b>之<b class='flag-5'>線程</b>池

    什么是線程安全?如何理解線程安全?

    在多線程編程中,線程安全是必須要考慮的因素。
    的頭像 發表于 05-30 14:33 ?2292次閱讀
    什么是<b class='flag-5'>線程</b>安全?如何理解<b class='flag-5'>線程</b>安全?

    線程池的線程怎么釋放

    線程分組看,pool名開頭線程占616條,而且waiting狀態也是616條,這個點就非常可疑了,我斷定就是這個pool開頭線程池導致的問題。我們先排查為何這個線程池中會有600+的
    發表于 07-31 10:49 ?2452次閱讀
    <b class='flag-5'>線程</b>池的<b class='flag-5'>線程</b>怎么釋放

    線程事務怎么回滾?一個簡單示例演示多線程事務

    在spring中可以使用@Transactional注解去控制事務,使出現異常時會進行回滾,在多線程中,這個注解則不會生效,如果主線程需要先執行一些修改數據庫的操作,當子線程在進行處理出現異常時,主
    發表于 08-09 12:22 ?763次閱讀
    多<b class='flag-5'>線程</b>事務怎么回滾?一個簡單<b class='flag-5'>示例</b>演示多<b class='flag-5'>線程</b>事務
    主站蜘蛛池模板: 殴美aⅴ| 轻点灬大ji巴太粗太大了小说 | 国产一区二区三区美女图片 | 婷婷久久综合九色综合九七 | 激情综合网五月婷婷 | 日本特黄a级高清免费酷网 日本特黄色大片 | 在线天堂中文字幕 | 亚洲欧美视频 | 免费在线你懂的 | 久久精品视频免费播放 | 91视频观看 | jiuse在线| 亚洲一区二区在线 | 天天成人综合网 | 深爱激情五月网 | 日韩美女影院 | 黄色超污网站 | 久久xxxx | 天天添天天操 | 亚洲精品一区二区中文 | 成人国产在线24小时播放视频 | 网红和老师啪啪对白清晰 | 亚洲精品美女在线观看 | 三级国产在线 | 国产在线永久视频 | 欧美精品福利 | 免费被视频网站在线观看 | 国产亚洲视频在线播放大全 | 99久久综合狠狠综合久久男同 | 色爽爽爽| 49pao强力免费打造在线高清 | 一级在线免费视频 | 深深激情网 | 伊人98| 成人午夜性a一级毛片美女 成人午夜性视频欧美成人 成人小视频在线 | 国产成人mv 在线播放 | 国产伦子一区二区三区四区 | 理论片久久 | 国产黄在线观看 | 午夜老司机永久免费看片 | 欧美视频一区二区三区在线观看 |