首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 守護線程詳解:JVM 退出的關鍵判斷標準

     編輯:Java 綜合教學

守護線程定義

守護線程 是為其他線程提供服務的後台線程(如 GC、Finalizer、JIT 編譯線程)。當 JVM 中僅剩守護線程時,JVM 會自動退出,不會等待守護線程結束。

實驗驗證

public class DaemonDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread daemon = new Thread(() -> {
            try {
                while (true) {
                    System.out.println("守護線程運行中...");
                    Thread.sleep(500);
                }
            } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        }, "Daemon-Thread");
        daemon.setDaemon(true); // 關鍵:設置為守護線程
        daemon.start();

        Thread user = new Thread(() -> {
            System.out.println("用戶線程工作 2 秒...");
            try { Thread.sleep(2000); } catch (InterruptedException e) {}
            System.out.println("用戶線程結束");
        }, "User-Thread");
        user.start();

        user.join(); // 主線程等待用戶線程
        System.out.println("主線程結束,JVM 即將退出");
    }
}

輸出現象

用戶線程工作 2 秒...
守護線程運行中...
守護線程運行中...
守護線程運行中...
用戶線程結束
主線程結束,JVM 即將退出
// 守護線程輸出驟停,無 finally 執行機會

關鍵規則

  1. setDaemon(true) 必須在 start() **之前**呼叫,否則拋 IllegalThreadStateException。
  2. 守護線程中創建的線程預設也是守護線程。
  3. JVM 退出時不會執行守護線程的 finally 區塊,資源釋放(關閉流、釋放鎖)不可依賴 finally。
  4. 主線程(main)屬於用戶線程。

典型應用場景

  • 定時清理快取、日誌異步刷盤、心跳檢測、監控指標上報。
  • Tomcat 容器啟動的後台掃描器線程(ContainerBackgroundProcessor)即設為守護線程。

常見誤區

「守護線程就是低優先級線程」——錯誤。優先級與守護屬性正交,守護線程可設高優先級,用戶線程可設低優先級。

總結

守護線程是「陪伴者」:有用戶線程存活時服務,用戶線程全數結束時隨 JVM 消亡。設計後台任務時,務必確認任務中斷無副作用(如僅寫內存快取、發送非關鍵指標),否則請用用戶線程配合 ShutdownHook 優雅關閉。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved