java编程实现生产者、消费者和共享数据区域,并编写测试代码验证
时间: 2024-01-30 15:02:26 浏览: 82
好的,以下是 Java 实现生产者消费者模式的示例代码:
```java
// 共享数据区域
class SharedDataArea {
private int data;
private boolean available = false;
// 生产者向共享数据区域添加数据
public synchronized void setData(int data) {
while (available) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.data = data;
available = true;
notifyAll();
}
// 消费者从共享数据区域获取数据
public synchronized int getData() {
while (!available) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
available = false;
notifyAll();
return data;
}
}
// 生产者
class Producer extends Thread {
private SharedDataArea sharedDataArea;
public Producer(SharedDataArea sharedDataArea) {
this.sharedDataArea = sharedDataArea;
}
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
sharedDataArea.setData(i);
System.out.println("生产者添加数据:" + i);
try {
sleep((int) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 消费者
class Consumer extends Thread {
private SharedDataArea sharedDataArea;
public Consumer(SharedDataArea sharedDataArea) {
this.sharedDataArea = sharedDataArea;
}
@Override
public void run() {
int data;
for (int i = 1; i <= 10; i++) {
data = sharedDataArea.getData();
System.out.println("消费者获取数据:" + data);
try {
sleep((int) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 测试代码
public class TestProducerConsumer {
public static void main(String[] args) {
SharedDataArea sharedDataArea = new SharedDataArea();
Producer producer = new Producer(sharedDataArea);
Consumer consumer = new Consumer(sharedDataArea);
producer.start();
consumer.start();
}
}
```
在这个示例代码中,`SharedDataArea` 类表示共享的数据区域,其中有一个 `data` 属性表示共享数据,和一个 `available` 属性表示是否有新的数据可用。`setData()` 方法用于向共享数据区域添加数据,`getData()` 方法用于从共享数据区域获取数据。这两个方法都使用了 `synchronized` 关键字来保证线程安全。
`Producer` 和 `Consumer` 类分别表示生产者和消费者,它们都继承自 `Thread` 类,并实现了 `run()` 方法。在 `Producer` 类中,我们使用了 `setData()` 方法向共享数据区域添加数据,并在控制台输出添加的数据;在 `Consumer` 类中,我们使用了 `getData()` 方法从共享数据区域获取数据,并在控制台输出获取的数据。在这两个类中,我们都使用了 `sleep()` 方法来模拟生产和消费数据的时间。
在 `TestProducerConsumer` 类中,我们创建了一个 `SharedDataArea` 对象和一个生产者和一个消费者,并调用它们的 `start()` 方法来启动线程。这样,生产者和消费者就可以开始生产和消费数据了。
运行这个程序,你会看到生产者和消费者在不断地生产和消费数据,直到生产者生产了 10 个数据为止。在这个过程中,我们可以看到共享数据区域的数据是如何被生产者和消费者共享的。
阅读全文