在Java中,wait()
方法是Object
類的一個方法,主要用于讓當前線程等待,直到其他線程調用同一個對象的notify()
或notifyAll()
方法。wait()
方法通常與synchronized
關鍵字和Lock
接口一起使用,以確保線程安全。
以下是使用wait()
方法時需要滿足的條件:
線程必須是對象的所有者或者擁有對象的監視器(monitor)。這意味著,只有當一個線程獲得了對象的鎖(通過synchronized
關鍵字或Lock
接口),它才能調用wait()
方法。
調用wait()
方法時,線程必須進入阻塞狀態。當線程調用wait()
方法時,它會釋放對象的鎖,并進入等待狀態。其他線程可以通過調用notify()
或notifyAll()
方法喚醒等待的線程。
在調用wait()
方法之前,線程需要使用synchronized
關鍵字或Lock
接口獲取對象的鎖。否則,將拋出IllegalMonitorStateException
異常。
為了避免虛假喚醒(spurious wakeup),通常需要在while
循環中檢查某個條件是否滿足,然后再調用wait()
方法。這樣可以確保線程在收到通知后,確實需要執行某些操作。
以下是一個簡單的示例,展示了如何使用wait()
、notify()
和synchronized
關鍵字:
public class Example {
private boolean condition = false;
public synchronized void waitForCondition() throws InterruptedException {
while (!condition) {
wait();
}
// 執行某些操作
}
public synchronized void setCondition() {
condition = true;
notify();
}
}
在這個示例中,waitForCondition()
方法使用synchronized
關鍵字確保只有獲得鎖的線程才能調用wait()
方法。setCondition()
方法在滿足條件時調用notify()
,喚醒等待的線程。