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

Java 線程暫停與喚醒:wait()/notify() 配合條件變數

     編輯:程式設計綜合問答

需求:線程暫停(時間未知),稍後在程式其他處喚醒。

核心模式

使用 `Object` 內建監視器鎖:

// 共用鎖物件
final Object lock = new Object();

// 消費者線程:資料不可用時等待
synchronized(lock) {
    while (!dataReady) {
        lock.wait();  // 釋放鎖並阻塞
    }
    // 被喚醒後繼續處理
    process(data);
}

// 生產者線程:資料準備好後通知
synchronized(lock) {
    data = produce();
    dataReady = true;
    lock.notifyAll(); // 喚醒所有等待線程
}

關鍵點

  • `wait()`/`notify()` **必須在 `synchronized(lock)` 區塊內**呼叫,否則拋 `IllegalMonitorStateException`。
  • 用 `while` 而非 `if` 檢查條件,防止虛假喚醒。
  • 高階替代:`java.util.concurrent` 的 `BlockingQueue`、`CountDownLatch`、`CompletableFuture`,更安全易用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved