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

Java 多線程實例詳解(二):阻塞、優先級與守護線程

     編輯:Java 相關知識

前言

承接上篇,本文聚焦線程阻塞狀態、控制方法、守護線程、優先級與讓步機制,透過代碼實例演示核心行為。

一、常見阻塞方法

join() — 等待線程終止
調用線程進入 WAITING,直到目標線程 TERMINATED。
場景:主線程等待子線程初始化完成。
sleep(ms) — 定時休眠
當前線程 TIMED_WAITING,**不釋放鎖**。
技巧:new Thread(r).start(); Thread.sleep(1); 可大概率讓新線程先獲得 CPU 片段。
wait()/notify() — 對象監視器等待/通知
必須在 synchronized 內調用,**釋放鎖**,進入 WAITING。詳見下篇「線程通訊」。

代碼:join 示例

public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(() -> {
        for (int i = 0; i < 5; i++) { System.out.println("子線程 " + i); sleep(200); }
    });
    t.start();
    System.out.println("主線程等待子線程...");
    t.join(); // 阻塞直到 t 結束
    System.out.println("主線程繼續");
}

二、守護線程

  • setDaemon(true) 必須在 start() 前調用。
  • JVM 中只有守護線程時,JVM 退出(如 GC、Finalizer、JIT 編譯線程)。
  • 用戶線程結束 → 守護線程自動終止(非立即,需等待安全點)。
Thread daemon = new Thread(() -> {
    while (true) { System.out.println("守護執行中"); sleep(500); }
});
daemon.setDaemon(true);
daemon.start();
sleep(2000); // 主線程結束,程序退出,守護線程不再輸出

三、線程優先級

  • 範圍 1 (MIN) ~ 10 (MAX),預設 5 (NORM)。
  • 繼承父線程優先級。
  • 僅是調度提示,不保證執行順序,跨平台行為差異大,**生產不建議依賴**。
Thread high = new Thread(() -> { for(int i=0;i<10;i++) System.out.println("H"); });
Thread low  = new Thread(() -> { for(int i=0;i<10;i++) System.out.println("L"); });
high.setPriority(Thread.MAX_PRIORITY);
low.setPriority(Thread.MIN_PRIORITY);
high.start(); low.start(); // 輸出順序不確定

四、線程讓步

  • Thread.yield():當前線程從 RUNNING → RUNNABLE,重新參與調度。
  • 調度器**可能**選擇同優先級或更高優先級線程執行。
  • 同 sleep(0) 效果類似,但不進入 TIMED_WAITING。

五、總結

阻塞與控制是多線程協作基石。join 用於等待結果,sleep 用於節流/定時,守護線程 用於輔助任務,**優先級與 yield 僅作提示不可依賴**。下篇將深入「線程安全、同步鎖、wait/notify、生產者消費者」。

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