如何在Java中使用`wait()`和`notify()`实现生产者-消费者模式?
时间: 2024-10-27 20:11:11 浏览: 32
在Java中,`wait()`和`notify()`方法通常用于实现线程间的通信,特别是在生产者-消费者模式中。这种模式涉及两个主要角色:生产者和消费者,它们通过一个共享的缓冲区进行通信。以下是一个简单的示例,展示如何使用`wait()`和`notify()`来实现生产者-消费者模式。
### 示例代码
```java
class SharedBuffer {
private int data;
private boolean isEmpty = true;
public synchronized void put(int value) throws InterruptedException {
while (!isEmpty) {
wait(); // 如果缓冲区不为空,等待
}
data = value;
isEmpty = false;
notify(); // 通知消费者可以取数据了
}
public synchronized int get() throws InterruptedException {
while (isEmpty) {
wait(); // 如果缓冲区为空,等待
}
isEmpty = true;
notify(); // 通知生产者可以放数据了
return data;
}
}
class Producer implements Runnable {
private final SharedBuffer buffer;
public Producer(SharedBuffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
buffer.put(i);
System.out.println("Produced: " + i);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
class Consumer implements Runnable {
private final SharedBuffer buffer;
public Consumer(SharedBuffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
int value = buffer.get();
System.out.println("Consumed: " + value);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
public class Main {
public static void main(String[] args) {
SharedBuffer buffer = new SharedBuffer();
Thread producer = new Thread(new Producer(buffer));
Thread consumer = new Thread(new Consumer(buffer));
producer.start();
consumer.start();
}
}
```
### 解释
1. **SharedBuffer类**: 这是一个共享缓冲区,包含一个整数数据和一个布尔值表示缓冲区是否为空。`put()`方法用于将数据放入缓冲区,而`get()`方法用于从缓冲区取出数据。这两个方法都是同步的,并且在适当的时候调用`wait()`和`notify()`来协调生产者和消费者的行为。
2. **Producer类**: 生产者线程,负责向共享缓冲区中放置数据。每次放置数据后,它会通知消费者线程。
3. **Consumer类**: 消费者线程,负责从共享缓冲区中取出数据。每次取出数据后,它会通知生产者线程。
4. **Main类**: 主程序,创建并启动生产者和消费者线程。
###
阅读全文