某蛋糕店内有3位师傅,店外有5位顾客,商店内最多存放10个蛋糕。 顾客不断购买蛋糕,每卖出一块蛋糕,师傅们就会做一个补上货架。 若货架上的蛋糕卖完了,顾客们需要等待,直到师傅把蛋糕做好。 ——Java请模拟出蛋糕的制作和售卖同时进行的情况。
时间: 2024-09-29 17:07:36 浏览: 20
你可以使用Java中的并发包(如`java.util.concurrent`)来模拟这个场景,这里可以创建一个简单的线程池模型来处理订单和蛋糕的制作。以下是一个简单的示例:
```java
import java.util.*;
import java.util.concurrent.*;
class Cake {
private boolean available = true;
public synchronized void sell() {
if (available) {
System.out.println("Customer bought a cake, now there are " + cakesLeft());
available = false;
} else {
System.out.println("Waiting for the next cake to be ready...");
}
}
public synchronized int cakesLeft() {
return CakeShop.cakes.size();
}
private static final int MAX_CAKES = 10;
private static final ExecutorService executor = Executors.newFixedThreadPool(3); // 师傅的数量
private static class CakeShop {
private static final Queue<Cake> cakes = new LinkedList<>();
private static AtomicInteger orders = new AtomicInteger();
public static void addCake() {
cakes.add(new Cake());
orders.incrementAndGet(); // 记录订单数
}
public static void bake() {
if (orders.get() > 0 && cakes.size() < MAX_CAKES) {
Runnable bakerTask = () -> {
try {
Thread.sleep(1000); // 假设每个蛋糕制作时间1秒
cakes.poll().sell(); // 制作完成并出售
orders.decrementAndGet(); // 减少订单数
} catch (InterruptedException e) {
e.printStackTrace();
}
};
executor.execute(bakerTask);
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
CakeShop.addCake(); // 添加顾客订单
}
while (true) {
CakeShop.bake(); // 模拟师傅制作蛋糕
// 这里也可以添加随机暂停以模拟真实环境中的顾客等待
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
在这个例子中,`Cake`类代表蛋糕,`CakeShop`类管理蛋糕库存和订单。`ExecutorService`模拟了师傅的工作线程,当订单足够且蛋糕库存不足时,师傅开始制作新蛋糕。注意,这个模型假设每个师傅工作速度一致,并且所有蛋糕制作时间都是固定的。实际应用中,可以根据需求调整线程模型。
阅读全文