用 wait-notify 写一段代码来解决生产者-消费者问题?
时间: 2024-09-07 16:06:34 浏览: 48
生产者-消费者问题是一个经典的多线程同步问题,其中生产者生产产品放入缓冲区,而消费者从缓冲区取走产品消费。为了保证线程安全,我们需要使用同步机制来控制对共享资源的访问。以下是使用`wait()`和`notify()`方法解决生产者-消费者问题的一个简单示例:
```java
import java.util.LinkedList;
import java.util.Queue;
public class ProducerConsumerExample {
private final Queue<Object> buffer = new LinkedList<>();
private final int bufferSize = 10; // 缓冲区大小
public void producer() throws InterruptedException {
while (true) {
synchronized (buffer) {
while (buffer.size() == bufferSize) {
buffer.wait(); // 缓冲区满,生产者等待
}
Object item = new Object();
buffer.add(item);
System.out.println("生产者生产了一个产品: " + item);
buffer.notifyAll(); // 通知消费者产品已放入缓冲区
}
Thread.sleep(1000); // 模拟生产时间
}
}
public void consumer() throws InterruptedException {
while (true) {
synchronized (buffer) {
while (buffer.isEmpty()) {
buffer.wait(); // 缓冲区空,消费者等待
}
Object item = buffer.remove();
System.out.println("消费者消费了一个产品: " + item);
buffer.notifyAll(); // 通知生产者缓冲区有空位了
}
Thread.sleep(1000); // 模拟消费时间
}
}
public static void main(String[] args) {
ProducerConsumerExample example = new ProducerConsumerExample();
Thread producerThread = new Thread(example::producer);
Thread consumerThread = new Thread(example::consumer);
producerThread.start();
consumerThread.start();
}
}
```
在这个例子中,我们创建了一个`ProducerConsumerExample`类,其中包含一个`buffer`队列作为生产者和消费者共享的资源,以及`producer`和`consumer`两个方法。生产者在生产一个产品后会通知消费者,而消费者在消费一个产品后也会通知生产者。当队列满时,生产者调用`wait()`进入等待状态,直到消费者消费产品后调用`notifyAll()`唤醒生产者。当队列空时,消费者也会做相同的操作。
阅读全文