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

Java 線程調度:守護線程完整指南

     編輯:Java 相關知識

守護線程核心概念

守護線程是為其他線程提供服務的後台線程。JVM 的垃圾回收、內存管理、Finalizer 等都是典型守護線程。關鍵特性:

  • JVM 退出條件:當所有非守護線程(用戶線程)結束時,JVM 會自動退出,不再等待守護線程
  • 設置時機:必須在 start() 前調用 setDaemon(true),否則拋出 IllegalThreadStateException
  • 繼承性:守護線程創建的子線程默認也是守護線程

setDaemon() 方法詳解

public final void setDaemon(boolean on)
```
參數:on - true 標記為守護線程
拋出:
- IllegalThreadStateException:線程已啟動
- SecurityException:無權限修改線程
```

代碼示例:守護線程 vs 用戶線程

/** 
 * Java線程:線程的調度-守護線程
 * @author leizhimin
 */
public class Test {
    public static void main(String[] args) {
        Thread t1 = new MyCommon();      // 用戶線程
        Thread t2 = new Thread(new MyDaemon());
        t2.setDaemon(true); // 設置為守護線程
        t2.start();
        t1.start();
    }
}

class MyCommon extends Thread {
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("線程1第" + i + "次執行!");
            try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); }
        }
    }
}

class MyDaemon implements Runnable {
    public void run() {
        for (long i = 0; i < 9999999L; i++) {
            System.out.println("後台線程第" + i + "次執行!");
            try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); }
        }
    }
}

運行結果分析

後台線程第0次執行!
線程1第0次執行!
線程1第1次執行!
後台線程第1次執行!
後台線程第2次執行!
線程1第2次執行!
線程1第3次執行!
後台線程第3次執行!
線程1第4次執行!
後台線程第4次執行!
後台線程第5次執行!
後台線程第6次執行!
後台線程第7次執行!
Process finished with exit code 0

明顯可見:

  • 用戶線程 (線程1) 完整執行 0-4 共5次
  • 守護線程 僅執行到第7次,JVM 即退出
  • 守護線程未完成巨大循環 (9999999次) 就被強制終止

實際應用與最佳實踐

  • 資源清理任務:定期掃描臨時文件、過期緩存
  • 監控服務:連接池監控、心跳檢測、性能指標收集
  • 注意:守護線程中不應執行關鍵業務邏輯(如事務提交、數據持久化),因為可能隨時被終止
  • 關閉鉤子:重要清理工作應用 Runtime.addShutdownHook() 而非守護線程

出處:https://lavasoft.blog.51cto.com/62575/221845

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