守護線程 是為其他線程提供服務的後台線程(如 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 執行機會

setDaemon(true) 必須在 start() **之前**呼叫,否則拋 IllegalThreadStateException。main)屬於用戶線程。ContainerBackgroundProcessor)即設為守護線程。「守護線程就是低優先級線程」——錯誤。優先級與守護屬性正交,守護線程可設高優先級,用戶線程可設低優先級。
守護線程是「陪伴者」:有用戶線程存活時服務,用戶線程全數結束時隨 JVM 消亡。設計後台任務時,務必確認任務中斷無副作用(如僅寫內存快取、發送非關鍵指標),否則請用用戶線程配合 ShutdownHook 優雅關閉。