写一个 java 生产者消费者模式
时间: 2024-02-28 11:54:29 浏览: 67
Java 生产者消费者模式
以下是一个基本的 Java 生产者-消费者模式的示例:
```java
import java.util.LinkedList;
public class ProducerConsumerExample {
public static void main(String[] args) {
final LinkedList<Integer> buffer = new LinkedList<>();
final int maxSize = 10;
Thread producer = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (buffer) {
while (buffer.size() == maxSize) {
try {
buffer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int number = (int) (Math.random() * 100);
buffer.add(number);
System.out.println("Produced " + number);
buffer.notifyAll();
}
}
}
});
Thread consumer = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (buffer) {
while (buffer.isEmpty()) {
try {
buffer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int number = buffer.removeFirst();
System.out.println("Consumed " + number);
buffer.notifyAll();
}
}
}
});
producer.start();
consumer.start();
}
}
```
在这个示例中,我们有一个缓冲区 `buffer`,它是一个 `LinkedList`,用于存储生产者生成的数字。缓冲区的最大大小由变量 `maxSize` 决定。
我们有两个线程:一个生产者和一个消费者。生产者线程生成一个随机数字并将其添加到缓冲区中。如果缓冲区已满,生产者线程将等待直到消费者线程消耗了一些数字并释放了空间。
消费者线程从缓冲区中删除第一个数字并将其打印到控制台。如果缓冲区为空,消费者线程将等待直到生产者线程添加了数字。
我们使用 `synchronized` 来确保生产者和消费者线程访问缓冲区时是互斥的。当缓冲区已满或为空时,我们使用 `wait()` 方法使线程等待,直到条件得到满足。当一个数字被添加或删除时,我们使用 `notifyAll()` 方法通知等待的线程。
这是一个简单的示例,你可以根据你自己的需求进行修改和扩展。
阅读全文