编程实现生产者、消费者和共享数据区域,并编写测试代码验证。
时间: 2024-03-06 13:50:13 浏览: 78
生产者消费者的c++代码实现
5星 · 资源好评率100%
好的,我可以为您提供一份Java代码示例:
```java
public class SharedData {
private int data; // 共享数据区域
private boolean available = false; // 是否有数据可供消费
// 生产者生产数据
public synchronized void produce(int newData) {
while (available) { // 如果有数据可供消费,则等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
data = newData; // 生产数据
available = true; // 标记有数据可供消费
System.out.println("Producer produced: " + data);
notifyAll(); // 通知消费者有数据可供消费
}
// 消费者消费数据
public synchronized int consume() {
while (!available) { // 如果没有数据可供消费,则等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
available = false; // 标记没有数据可供消费
System.out.println("Consumer consumed: " + data);
notifyAll(); // 通知生产者有空间可以生产数据
return data;
}
}
public class Producer implements Runnable {
private SharedData sharedData;
public Producer(SharedData sharedData) {
this.sharedData = sharedData;
}
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
sharedData.produce(i);
}
}
}
public class Consumer implements Runnable {
private SharedData sharedData;
public Consumer(SharedData sharedData) {
this.sharedData = sharedData;
}
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
sharedData.consume();
}
}
}
public class Main {
public static void main(String[] args) {
SharedData sharedData = new SharedData();
Producer producer = new Producer(sharedData);
Consumer consumer = new Consumer(sharedData);
Thread producerThread = new Thread(producer);
Thread consumerThread = new Thread(consumer);
producerThread.start();
consumerThread.start();
}
}
```
上面的代码中,SharedData 类代表共享数据区域。在 produce 方法中,使用 synchronized 加锁,确保生产者之间不会出现数据覆盖的情况。在 consume 方法中,使用 synchronized 加锁,确保消费者之间不会出现数据覆盖的情况。在 main 方法中,创建一个生产者线程和一个消费者线程,然后启动这两个线程即可。
希望这份代码能够帮助到您。
阅读全文