写一个生产者消费者模型:思路 wait() 和 notify() 方法来实现
时间: 2024-09-23 19:05:18 浏览: 33
生产者消费者模型是一种经典的并发控制机制,它用于解决两个线程之间的同步问题,一个线程作为生产者负责生产数据,另一个线程作为消费者负责消费数据。在这种模型中,通常会使用Java的`synchronized`, `wait()`, 和 `notify()` 或 `notifyAll()` 方法来协调它们的行为。
以下是基于数组的基本实现:
```java
class Buffer {
private final Object lock = new Object(); // 锁对象
private int[] items;
private int count; // 当前缓冲区中的元素数量
public Buffer(int size) {
items = new int[size];
count = 0;
}
public synchronized void produce(int item) throws InterruptedException {
while (count == items.length) { // 缓冲区满,生产者等待
this.wait(lock); // 等待
}
items[count++] = item; // 生产元素
this.notify(); // 唤醒下一个等待的消费者
}
public synchronized int consume() throws InterruptedException {
while (count == 0) { // 缓冲区空,消费者等待
this.wait(lock); // 等待
}
int item = items[--count]; // 消费元素
this.notify(); // 唤醒可能正在等待的生产者
return item;
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
Buffer buffer = new Buffer(5);
Thread producer = new Thread(() -> {
for (int i = 0; i < 10; i++) {
buffer.produce(i);
System.out.println("Produced: " + i);
}
});
Thread consumer = new Thread(() -> {
for (int i = 0; i < 10; i++) {
int item = buffer.consume();
System.out.println("Consumed: " + item);
}
});
producer.start();
consumer.start();
}
}
```
在这个例子中,当缓冲区满时,生产者调用`wait(lock)`进入等待状态,消费者唤醒时继续执行;当缓冲区为空时,消费者等待,生产者唤醒后开始生产新的元素。
阅读全文