java编程实现生产者-消费者面包问题。消费者随机,消费数量随机
时间: 2023-06-09 08:04:22 浏览: 137
java网络编程生产者消费者问题.doc.doc
生产者-消费者模型是一种经典的并发编程模型,可以用来解决并发环境下共享资源的访问问题。面包问题是其中一个经典问题,我可以向您介绍如何用Java编写一个解决方案。
首先,我们需要定义一个面包类来表示共享资源。在这个类中,我们需要实现生产和消费方法,以及一个计数器来跟踪面包数量。代码示例如下:
```
public class Bread {
private int count = 0;
public synchronized void produce() throws InterruptedException {
while (count >= 5) {
wait();
}
count++;
System.out.println("Producing bread, current count: " + count);
notifyAll();
}
public synchronized void consume() throws InterruptedException {
while (count <= 0) {
wait();
}
count--;
System.out.println("Consuming bread, current count: " + count);
notifyAll();
}
}
```
在这个代码中,`synchronized`关键字保证了生产和消费方法的互斥访问,`wait`和`notifyAll`方法用来实现线程间的等待和唤醒。在生产方法中,我们通过一个`while`循环判断是否可以生产面包,如果面包数量已经达到上限,就调用`wait`方法将当前线程挂起。在消费方法中,我们同样使用`while`循环判断是否可以消费面包,如果面包数量已经为0,就调用`wait`方法将当前线程挂起。当生产和消费方法执行完后,都会调用`notifyAll`方法唤醒其他线程。
接下来,我们定义一个生产者和消费者类来实现具体的线程。在这个类中,我们需要实现一个`run`方法来执行线程任务。代码示例如下:
```
public class Producer implements Runnable {
private Bread bread;
public Producer(Bread bread) {
this.bread = bread;
}
@Override
public void run() {
try {
while (true) {
bread.produce();
Thread.sleep((int) (Math.random() * 1000));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Consumer implements Runnable {
private Bread bread;
public Consumer(Bread bread) {
this.bread = bread;
}
@Override
public void run() {
try {
while (true) {
bread.consume();
Thread.sleep((int) (Math.random() * 1000));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
在这个代码中,我们通过一个`while`循环来不断执行生产和消费操作。在每次执行后,线程会随机休眠一段时间,模拟真实的生产和消费过程。
最后,我们可以在`main`函数中启动多个生产者和消费者线程,来模拟多线程并发访问共享资源的情况。具体代码如下:
```
public static void main(String[] args) {
Bread bread = new Bread();
for (int i = 0; i < 5; i++) {
new Thread(new Producer(bread)).start();
new Thread(new Consumer(bread)).start();
}
}
```
在这个代码中,我们创建了5个生产者和5个消费者线程,他们共同访问一个面包实例。每个线程都会执行不断地生产和消费操作,直到程序结束。
希望这个代码可以帮助您了解生产者-消费者模型的实现,如果您有任何问题,请随时向我提出。
阅读全文