成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java并發(fā)編程:守護線程

開發(fā) 前端
Java程序在什么情況下會正常退出?當JVM中唯一運行的線程都是守護線程時,Java虛擬機才會退出。這句話源自JDK官方文檔,即:當JVM中沒有正在運行的非守護線程時,JVM進程會退出。

什么是守護線程?

與普通線程相比,守護線程(Daemon Thread)是一種特殊類型的線程。它的特殊性體現在哪里?在理解之前,我們需要先明確一個問題:

Java程序在什么情況下會正常退出?當JVM中唯一運行的線程都是守護線程時,Java虛擬機才會退出。這句話源自JDK官方文檔,即:當JVM中沒有正在運行的非守護線程時,JVM進程會退出。

直接理解可能有些抽象,但通過以下代碼示例會更清晰:

public class Demo1 {
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建一個用戶線程(非守護線程)
        Thread userThread = new Thread(() -> {
            // 無限循環(huán)
            while (true) {
                System.out.println("用戶線程正在運行...");
                try {
                    Thread.sleep(2000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        userThread.start();

        Thread.sleep(1000);
        // 添加關閉鉤子
        Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("關閉鉤子正在運行...")));
        System.out.println("主線程即將執(zhí)行完畢");
    }
}

我們創(chuàng)建了一個用戶線程,其邏輯是無限循環(huán)。運行這段代碼后,猜猜主線程結束后,JVM進程會自動退出嗎?

輸出結果:

用戶線程正在運行...
主線程即將執(zhí)行完畢
用戶線程正在運行...
用戶線程正在運行...
用戶線程正在運行...
用戶線程正在運行...
...

可以看到,由于后臺始終有一個非守護線程在運行,JVM無法正常自動退出,且關閉鉤子(ShutdownHook)的邏輯也不會執(zhí)行。程序會每隔2秒持續(xù)輸出“用戶線程正在運行...”。那么,如果是守護線程運行會怎樣?

通過Thread.setDaemon(true)方法將線程設置為守護線程。代碼如下:

public class Demo2 {
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建一個守護線程
        Thread thread = new Thread(() -> {
            // 無限循環(huán)
            while (true) {
                System.out.println("守護線程正在運行...");
                try {
                    Thread.sleep(2000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.setDaemon(true); // 設置為守護線程
        thread.start();

        Thread.sleep(1000);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("關閉鉤子正在運行...")));
        System.out.println("主線程即將執(zhí)行完畢");
    }
}

再次運行代碼,觀察結果:

輸出結果:

守護線程正在運行...
主線程即將執(zhí)行完畢
關閉鉤子正在運行...

可以看到,當主線程退出時,JVM會直接退出,守護線程也隨之終止。即使內部有無限循環(huán),守護線程也會立即停止。

守護線程的作用與使用場景

作用

Java引入守護線程的主要目的是提供一種機制來支持后臺任務的執(zhí)行。守護線程在程序生命周期中扮演輔助角色,為其他線程提供支持和服務。

以垃圾回收線程(GC)為例,它是一個經典的守護線程。當程序中不再有任何運行中的用戶線程時,程序也不會再產生垃圾,垃圾回收線程也就無事可做。因此,當JVM中只剩下垃圾回收線程時,JVM會自動退出。GC始終在后臺低優(yōu)先級運行,實時監(jiān)控和管理系統中的可回收資源。

使用場景

  1. 后臺任務守護線程常用于執(zhí)行與主線程無關的后臺任務,例如日志記錄、定時任務、監(jiān)控等。這些任務可以默默在程序后臺運行,不影響主流程。
  2. 垃圾回收垃圾回收是JVM的重要功能,負責回收無用對象并釋放內存。垃圾回收線程是守護線程,會在程序運行時自動執(zhí)行。
  3. 資源管理守護線程可用于資源管理,例如數據庫連接池中的線程池管理器。它可以監(jiān)控空閑連接,若連接長時間未使用,守護線程會自動關閉連接以避免資源浪費。
  4. 守護服務在服務器應用中,守護線程常用于提供服務。例如,Web服務器中的守護線程可以監(jiān)聽客戶端請求。當所有客戶端連接斷開后,守護線程會自動關閉服務器。

注意事項守護線程的終止是不可控的。當程序中只剩下守護線程時,它會隨主線程結束而自動終止。因此,使用守護線程時需確保任務可中斷或可恢復,且不會影響程序的整體邏輯。

責任編輯:武曉燕 來源: 程序猿技術充電站
相關推薦

2011-12-29 13:31:15

Java

2025-02-19 00:05:18

Java并發(fā)編程

2025-01-10 07:10:00

2025-02-06 03:14:38

2019-11-07 09:20:29

Java線程操作系統

2024-12-31 09:00:12

Java線程狀態(tài)

2025-02-03 08:23:33

2023-10-08 09:34:11

Java編程

2023-10-18 15:19:56

2022-11-09 09:01:08

并發(fā)編程線程池

2019-09-16 08:45:53

并發(fā)編程通信

2025-07-03 07:10:00

線程池并發(fā)編程代碼

2022-03-31 07:52:01

Java多線程并發(fā)

2025-02-03 00:40:00

線程組Java并發(fā)編程

2017-01-10 13:39:57

Python線程池進程池

2023-09-26 10:30:57

Linux編程

2017-09-19 14:53:37

Java并發(fā)編程并發(fā)代碼設計

2023-10-18 09:27:58

Java編程

2021-05-06 08:11:03

Java用戶線程守護線程

2025-06-18 08:10:00

Java并發(fā)編程開發(fā)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美在线一区视频 | 嫩草研究影院 | 亚洲成av人影片在线观看 | 午夜视频免费在线观看 | 国产精品国产三级国产aⅴ中文 | 极品电影院 | 蜜桃视频在线观看免费视频网站www | 亚洲国产精品一区二区三区 | 欧美中国少妇xxx性高请视频 | 国产成人高清 | 一区二区在线 | 成人h动漫精品一区二区器材 | 91免费版在线 | 久久人爽 | 免费骚视频 | 精品国产一区二区国模嫣然 | 日韩成人精品在线 | 久久久做| 祝你幸福电影在线观看 | 亚洲免费在线观看 | 性一爱一乱一交一视频 | 欧州一区二区三区 | 黄网站免费在线观看 | 久久精品a| 日韩视频在线观看中文字幕 | 日韩精品在线看 | 久久久久久久久国产精品 | 国产高清一二三区 | 日韩欧美国产精品一区二区三区 | 日韩在线播放网址 | 一区二区三区四区在线视频 | www.av7788.com| 亚洲精品一区二区三区蜜桃久 | 久久99久久久久 | 亚洲精品99999 | 欧美日韩高清免费 | 天堂网中文 | 超碰在线免费公开 | 欧美精品综合 | 一区二区三区视频在线观看 | 国产高清视频在线观看 |