在Java中,wait()
方法用于讓當前線程等待,直到其他線程調用同一個對象的notify()
或notifyAll()
方法。在多線程環境中,wait()
和notify()
或notifyAll()
方法必須在一個同步代碼塊或同步方法中使用,以確保線程安全。
以下是一個簡單的示例,展示了如何在多線程環境中使用wait()
和notifyAll()
:
public class WaitNotifyExample {
private static final Object lock = new Object();
private static boolean dataReady = false;
public static void main(String[] args) {
Thread producer = new Thread(new Producer());
Thread consumer = new Thread(new Consumer());
producer.start();
consumer.start();
}
static class Producer implements Runnable {
@Override
public void run() {
synchronized (lock) {
System.out.println("生產者生產數據...");
dataReady = true;
lock.notifyAll(); // 通知消費者數據已準備好
try {
lock.wait(); // 等待消費者消費數據
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Consumer implements Runnable {
@Override
public void run() {
synchronized (lock) {
System.out.println("消費者等待數據...");
while (!dataReady) {
try {
lock.wait(); // 等待生產者生產數據
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消費者消費數據...");
}
}
}
}
在這個示例中,我們有一個生產者線程和一個消費者線程。生產者生產數據后,調用lock.notifyAll()
通知消費者數據已準備好。消費者在等待數據的過程中,調用lock.wait()
進入等待狀態。當生產者通知消費者數據已準備好時,消費者會被喚醒并繼續執行。