在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()
进入等待状态。当生产者通知消费者数据已准备好时,消费者会被唤醒并继续执行。