(3)java编程实现生产者、消费者和共享数据区域,并编写测试代码验证。
时间: 2024-03-08 10:46:30 浏览: 34
好的,下面是Java语言的生产者-消费者问题的实现,使用了Java中的多线程和锁机制来实现。
```java
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
public class ProducerConsumer {
public static void main(String[] args) {
Queue<Integer> buffer = new LinkedList<>();
int bufferSize = 5;
Object lock = new Object();
Thread producer = new Thread(new Producer(buffer, bufferSize, lock));
Thread consumer = new Thread(new Consumer(buffer, lock));
producer.start();
consumer.start();
}
}
class Producer implements Runnable {
private Queue<Integer> buffer;
private int bufferSize;
private Object lock;
public Producer(Queue<Integer> buffer, int bufferSize, Object lock) {
this.buffer = buffer;
this.bufferSize = bufferSize;
this.lock = lock;
}
@Override
public void run() {
while (true) {
synchronized (lock) {
// 如果缓冲区满了,等待
while (buffer.size() == bufferSize) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生成一个随机数
int item = new Random().nextInt(100);
buffer.offer(item);
System.out.println("Producer produced " + item);
// 发出条件变量通知
lock.notify();
}
// 等待一段时间
try {
Thread.sleep(new Random().nextInt(500));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private Queue<Integer> buffer;
private Object lock;
public Consumer(Queue<Integer> buffer, Object lock) {
this.buffer = buffer;
this.lock = lock;
}
@Override
public void run() {
while (true) {
synchronized (lock) {
// 如果缓冲区为空,等待
while (buffer.isEmpty()) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int item = buffer.poll();
System.out.println("Consumer consumed " + item);
// 发出条件变量通知
lock.notify();
}
// 等待一段时间
try {
Thread.sleep(new Random().nextInt(500));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
在上面的代码中,我们创建了一个`buffer`变量作为共享数据区域,同时定义了一个缓冲区的大小`bufferSize`。我们使用Java中的多线程和锁机制来创建了两个线程,一个是生产者线程,一个是消费者线程。在生产者线程中,我们使用一个`while`循环不断生成随机数,并将其放入缓冲区中。在消费者线程中,我们从缓冲区中取出数据并打印出来。注意,在访问共享数据区域时,我们使用了`synchronized`关键字来进行互斥访问,并使用条件变量`lock`来进行线程间的通信。
下面是一个测试代码,我们启动多个生产者和消费者线程,来模拟多个线程同时对共享数据区域进行访问:
```java
public class ProducerConsumerTest {
public static void main(String[] args) {
Queue<Integer> buffer = new LinkedList<>();
int bufferSize = 5;
Object lock = new Object();
Thread[] producers = new Thread[3];
Thread[] consumers = new Thread[3];
for (int i = 0; i < 3; i++) {
producers[i] = new Thread(new Producer(buffer, bufferSize, lock));
consumers[i] = new Thread(new Consumer(buffer, lock));
producers[i].start();
consumers[i].start();
}
}
}
```
在上面的代码中,我们创建了3个生产者线程和3个消费者线程,并启动它们。当我们运行测试代码时,会看到生产者不断生产数据,消费者不断消费数据,直到程序结束。
这就是一个简单的Java语言的生产者-消费者问题的实现,希望能对您有所帮助!
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)