守護執行緒在程式運行期間於背景提供**通用服務**(如 GC、日誌清理、心跳監測),**不屬於程式核心部分**。其生命週期特性:
main() 執行緒),程式持續運行。setDaemon(true):啟動**前**設定為守護執行緒(啟動後設定拋出 IllegalThreadStateException)。isDaemon():檢查守護狀態。class Daemon extends Thread {
public Daemon() {
setDaemon(true); // 標記為守護執行緒
start();
}
public void run() {
for (int i = 0; i < SIZE; i++) t[i] = new DaemonSpawn(i);
for (int i = 0; i < SIZE; i++)
System.out.println("t[" + i + "].isDaemon() = " + t[i].isDaemon());
while (true) yield(); // 釋放 CPU,避免佔用
}
}
class DaemonSpawn extends Thread {
public DaemonSpawn(int i) {
System.out.println("DaemonSpawn " + i + " started");
start();
}
public void run() { while (true) yield(); }
}
public static void main(String[] args) {
Thread d = new Daemon();
System.out.println("d.isDaemon() = " + d.isDaemon());
// 等待用戶輸入,防止 main 結束導致 JVM 退出
new BufferedReader(new InputStreamReader(System.in)).readLine();
}
DaemonSpawn 繼承父執行緒守護屬性,輸出均為 true。main() 為非守護執行緒,程式不會自動退出。yield() 而非空循環避免 CPU 佔用 100%,保持系統響應。System.in.readLine() 阻塞主執行緒,讓守護執行緒有時間啟動並輸出;若改為 sleep(),可能只看到部分輸出即程式結束。Runtime.addShutdownHook()) 適合處理優雅關閉邏輯,而非守護執行緒。守護執行緒是 Java 併發編程中「隱形後勤部隊」,正確使用能簡化背景服務管理。核心口訣:**服務性任務設為守護,核心業務必須非守護;啟動前設定,善用 yield 讓權。**