编写程序,模拟经典进程同步问题:生产者一消费者。 实现一个生产者和消费者模型,生产者生产数据放入缓冲区,消费者从 缓冲区取数据进行消费。4 生产者和消费者通过共享缓冲区进行数据交换,确保在任何时刻缓冲
时间: 2024-09-25 15:09:21 浏览: 50
在编写一个简单的生产者-消费者模型,通常我们会利用线程和条件变量来解决经典的并发问题,例如Java的`Thread`, `BlockingQueue` 和 `Condition`。下面是一个基于Java的简单示例:
```java
import java.util.concurrent.*;
public class BufferProducerConsumer {
private final BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
private final Object lock = new Object();
// 生产者线程
public class Producer implements Runnable {
@Override
public void run() {
while (true) {
synchronized (lock) {
if (queue.size() < MAX_CAPACITY) { // 当队列不满时
int data = generateData(); // 生产数据
try {
queue.put(data); // 将数据入队
lock.notify(); // 唤醒消费者
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
lock.wait(); // 队满等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
private int generateData() {
// 实现生成随机数或其他数据逻辑
return Math.abs(ThreadLocalRandom.current().nextInt());
}
}
// 消费者线程
public class Consumer implements Runnable {
@Override
public void run() {
while (true) {
synchronized (lock) {
if (queue.isEmpty()) { // 当队列为空时
try {
lock.wait(); // 消费者等待
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
int data = queue.take(); // 从队列取数据
consumeData(data); // 消耗数据
}
}
}
}
private void consumeData(int data) {
System.out.printf("Consumed data: %d%n", data);
}
}
public static void main(String[] args) {
BufferProducerConsumer producerConsumer = new BufferProducerConsumer();
Thread producer = new Thread(producerConsumer.new Producer(), "Producer");
Thread consumer = new Thread(producerConsumer.new Consumer(), "Consumer");
producer.start();
consumer.start();
}
}
阅读全文