wait()
方法是 Java 中的一個重要方法,主要用于線程間的通信和協作。它在 Object
類中定義,因此所有 Java 對象都可以使用這個方法。當在一個線程中調用某個對象的 wait()
方法時,該線程會釋放該對象的鎖(如果已經獲取了鎖),然后進入等待狀態,直到其他線程調用同一個對象的 notify()
或 notifyAll()
方法喚醒它。
以下是一些使用 wait()
方法的典型場景:
生產者-消費者問題:生產者線程生產數據并將其放入共享緩沖區(如隊列或數組),消費者線程從共享緩沖區中取出數據進行消費。在這種情況下,當緩沖區為空時,消費者線程應該調用 wait()
方法等待,直到生產者線程生產數據并放入緩沖區。同樣,當緩沖區已滿時,生產者線程應該調用 wait()
方法等待,直到消費者線程消費數據并清空緩沖區。
線程同步:當多個線程需要訪問共享資源(如文件、數據庫連接等)時,可以使用 wait()
和 notify()
或 notifyAll()
方法來實現線程間的同步。例如,當一個線程正在訪問共享資源時,其他線程應該調用 wait()
方法等待,直到當前線程完成操作并釋放資源。
以下是一個簡單的示例,展示了如何使用 wait()
和 notify()
方法實現生產者-消費者問題:
class Buffer {
private int data;
private boolean empty = true;
public synchronized void put(int data) throws InterruptedException {
while (!empty) {
wait(); // 等待,直到緩沖區為空
}
this.data = data;
empty = false;
notify(); // 喚醒等待的消費者線程
}
public synchronized int get() throws InterruptedException {
while (empty) {
wait(); // 等待,直到緩沖區非空
}
empty = true;
notify(); // 喚醒等待的生產者線程
return data;
}
}
請注意,在使用 wait()
方法時,必須確保線程在正確的條件下調用它,否則可能會導致死鎖。通常,需要在 while
循環中調用 wait()
方法,以便在條件不滿足時重復檢查條件。此外,調用 wait()
方法時應該始終在同步塊或同步方法中,以確保線程安全。