在Java中,wait()
方法是Object
類的一個方法,用于讓當前線程等待,直到其他線程調用該對象的notify()
或notifyAll()
方法。在使用wait()
方法時,需要注意以下幾點:
wait()
。這是因為wait()
方法會釋放對象的鎖,如果沒有同步代碼塊或同步方法,其他線程可能會在wait()
執行期間獲取到鎖并執行,從而導致死鎖。synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
// 處理異常
}
}
wait()
方法必須在while
循環中使用。這是因為wait()
方法可能會被意外喚醒(例如,由于線程調度),所以需要檢查等待的條件是否仍然滿足。如果條件不滿足,應該繼續等待。synchronized (lock) {
while (!condition) {
try {
lock.wait();
} catch (InterruptedException e) {
// 處理異常
}
}
}
在調用wait()
方法之前,需要獲取對象的鎖。否則,會拋出IllegalMonitorStateException
異常。
wait()
方法可能會拋出InterruptedException
異常,因此需要在方法簽名中聲明該異常,并在捕獲異常后進行處理。
通常與wait()
方法一起使用的還有notify()
和notifyAll()
方法。這兩個方法用于喚醒等待的線程。在使用這些方法時,需要注意避免虛假喚醒(spurious wakeup),即線程可能會在沒有收到通知的情況下被喚醒。為了處理這種情況,通常在while
循環中檢查等待的條件是否滿足。
notify()
方法只喚醒一個等待的線程,而notifyAll()
方法會喚醒所有等待的線程。根據實際需求選擇合適的方法。
在某些情況下,可能需要使用Object.wait(long timeout)
方法來設置等待的超時時間。這可以避免線程無限期地等待。