使用java语言编写一个生产者消费者模式
时间: 2024-03-02 09:48:35 浏览: 73
好的,以下是一个简单的Java代码示例,演示了如何使用生产者消费者模式:
```java
import java.util.LinkedList;
public class ProducerConsumerExample {
public static void main(String[] args) {
LinkedList<Integer> buffer = new LinkedList<>();
int maxSize = 5;
Thread producer = new Thread(new Producer(buffer, maxSize), "Producer");
Thread consumer = new Thread(new Consumer(buffer), "Consumer");
producer.start();
consumer.start();
}
public static class Producer implements Runnable {
private final LinkedList<Integer> buffer;
private final int maxSize;
public Producer(LinkedList<Integer> buffer, int maxSize) {
this.buffer = buffer;
this.maxSize = maxSize;
}
@Override
public void run() {
while (true) {
synchronized (buffer) {
while (buffer.size() == maxSize) {
try {
System.out.println("Buffer is full, waiting for consumer...");
buffer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int number = (int) (Math.random() * 100);
System.out.println("Producing number: " + number);
buffer.add(number);
buffer.notifyAll();
}
}
}
}
public static class Consumer implements Runnable {
private final LinkedList<Integer> buffer;
public Consumer(LinkedList<Integer> buffer) {
this.buffer = buffer;
}
@Override
public void run() {
while (true) {
synchronized (buffer) {
while (buffer.isEmpty()) {
try {
System.out.println("Buffer is empty, waiting for producer...");
buffer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int number = buffer.removeFirst();
System.out.println("Consuming number: " + number);
buffer.notifyAll();
}
}
}
}
}
```
在这个示例中,我们定义了一个 `Producer` 和一个 `Consumer` 类,它们都实现了 `Runnable` 接口,可在一个线程中运行。两个线程都使用了同一个共享的 `LinkedList` 对象,这是一个缓冲区,生产者往缓冲区中添加元素,消费者从缓冲区中移除元素。
在生产者消费者模式中,关键点是在生产者和消费者之间同步缓冲区。生产者会检查缓冲区是否已满,如果已满,则等待消费者消费一些元素。消费者会检查缓冲区是否为空,如果为空,则等待生产者生产一些元素。在生产者或消费者完成它们的工作后,会通知等待的线程继续运行。这个通知过程使用 `wait()` 和 `notifyAll()` 方法实现。
阅读全文