请讲解一下用Java的等待/通知机囤实现‘厨师-食囨’问题,假设分别有6位厨师和6位食囨。厨师做団盘菜的时间为4s,食囨吃団盘菜的时间为3s。编程实现这団囧能,参考“囥囦囨-消费囨”问题。的代码
时间: 2023-05-18 10:05:57 浏览: 128
使用Java的等待/通知机制实现‘厨师-食客’问题,可以使用以下代码:
```
public class ChefCustomerProblem {
public static void main(String[] args) {
Kitchen kitchen = new Kitchen();
for (int i = 0; i < 6; i++) {
new Thread(new Chef(kitchen)).start();
}
for (int i = 0; i < 6; i++) {
new Thread(new Customer(kitchen)).start();
}
}
}
class Kitchen {
private int dishCount = 0;
private final int MAX_DISH_COUNT = 10;
public synchronized void makeDish() {
while (dishCount >= MAX_DISH_COUNT) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
dishCount++;
System.out.println("厨师做了一道菜,当前菜品数量:" + dishCount);
notifyAll();
}
public synchronized void eatDish() {
while (dishCount <= 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
dishCount--;
System.out.println("食客吃了一道菜,当前菜品数量:" + dishCount);
notifyAll();
}
}
class Chef implements Runnable {
private Kitchen kitchen;
public Chef(Kitchen kitchen) {
this.kitchen = kitchen;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
kitchen.makeDish();
}
}
}
class Customer implements Runnable {
private Kitchen kitchen;
public Customer(Kitchen kitchen) {
this.kitchen = kitchen;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
kitchen.eatDish();
}
}
}
```
在这个代码中,Kitchen类表示厨房,其中dishCount表示当前菜品数量,MAX_DISH_COUNT表示最大菜品数量。makeDish()方法表示厨师做菜,如果当前菜品数量已经达到最大值,则等待;否则,增加菜品数量,并通知所有等待的线程。eatDish()方法表示食客吃菜,如果当前菜品数量为0,则等待;否则,减少菜品数量,并通知所有等待的线程。
Chef类表示厨师,每隔4秒钟做一道菜,调用Kitchen的makeDish()方法。Customer类表示食客,每隔3秒钟吃一道菜,调用Kitchen的eatDish()方法。
这个代码使用了Java的等待/通知机制,保证了厨师和食客之间的同步。
阅读全文