Java编程实现生产者、消费者和共享数据区域
时间: 2023-10-16 11:10:41 浏览: 46
好的,下面是Java代码实现生产者、消费者和共享数据区域的示例:
```java
public class DataBuffer {
private int[] buffer;
private int count;
private int size;
private int front;
private int rear;
public DataBuffer(int size) {
this.buffer = new int[size];
this.count = 0;
this.size = size;
this.front = 0;
this.rear = -1;
}
public synchronized void put(int data) throws InterruptedException {
while (count == size) {
wait();
}
rear = (rear + 1) % size;
buffer[rear] = data;
count++;
notifyAll();
}
public synchronized int get() throws InterruptedException {
while (count == 0) {
wait();
}
int data = buffer[front];
front = (front + 1) % size;
count--;
notifyAll();
return data;
}
}
public class Producer implements Runnable {
private DataBuffer buffer;
public Producer(DataBuffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
int data = (int) (Math.random() * 100);
buffer.put(data);
System.out.println("Producer put: " + data);
Thread.sleep((int) (Math.random() * 100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Consumer implements Runnable {
private DataBuffer buffer;
public Consumer(DataBuffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
int data = buffer.get();
System.out.println("Consumer get: " + data);
Thread.sleep((int) (Math.random() * 100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
DataBuffer buffer = new DataBuffer(5);
Producer producer = new Producer(buffer);
Consumer consumer = new Consumer(buffer);
Thread producerThread = new Thread(producer);
Thread consumerThread = new Thread(consumer);
producerThread.start();
consumerThread.start();
}
}
```
在上面的代码中,DataBuffer类是共享数据区域,它包含一个整型数组buffer和用于控制生产者和消费者访问buffer的count、front和rear变量。put()和get()方法分别用于向buffer中存储数据和从buffer中获取数据。Producer和Consumer类是生产者和消费者,它们分别使用put()和get()方法来存储和获取数据。在Main类中,我们创建了一个大小为5的DataBuffer对象,并创建了一个Producer线程和一个Consumer线程,分别用于执行Producer和Consumer类中的run()方法。通过这种方式,我们可以模拟生产者和消费者在共享数据区域中存储和获取数据的过程。