📅  最后修改于: 2023-12-03 14:54:37.245000             🧑  作者: Mango
披萨问题 (Pizza Problem) 通常用来展示并发编程中令人头痛的同步问题。该问题的场景通常是有多个人同时制作披萨。每个人都有面团、酱料、芝士和调料等材料。他们需要按照固定的步骤制作披萨,但这些步骤需要在不干扰其他人的同时按顺序完成。这就需要使用锁和条件变量等同步处理机制保证步骤的正确执行顺序。
一个披萨问题的解决方案通常包含以下步骤:
public class PizzaMaker implements Runnable {
private Lock lock;
private Condition condition;
private String name;
public PizzaMaker(Lock lock, Condition condition, String name) {
this.lock = lock;
this.condition = condition;
this.name = name;
}
public void run() {
try {
lock.lock();
System.out.println(name + " is preparing ingredients...");
Thread.sleep((long) (Math.random() * 1000));
System.out.println(name + " has prepared ingredients, waiting to place them on pizza...");
condition.await();
System.out.println(name + " is placing the ingredients on pizza...");
Thread.sleep((long) (Math.random() * 1000));
System.out.println(name + " has placed the ingredients on pizza, waiting for baking...");
condition.await();
System.out.println(name + " is putting the pizza into oven...");
Thread.sleep((long) (Math.random() * 1000));
System.out.println(name + " has put the pizza into oven, waiting for baking...");
condition.await();
System.out.println(name + " is taking the pizza out of oven...");
Thread.sleep((long) (Math.random() * 1000));
System.out.println(name + " has taken the pizza out of oven, waiting for cutting...");
condition.await();
System.out.println(name + " is cutting the pizza...");
Thread.sleep((long) (Math.random() * 1000));
System.out.println(name + " has cut the pizza, waiting for putting sauce on it...");
condition.await();
System.out.println(name + " is putting sauce on the pizza...");
Thread.sleep((long) (Math.random() * 1000));
System.out.println(name + " has put the sauce on the pizza, waiting for eating...");
condition.await();
System.out.println(name + " is enjoying the delicious pizza...");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
int num = 3; // 披萨制作人数
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
ExecutorService service = Executors.newCachedThreadPool();
for (int i = 0; i < num; i++) {
service.submit(new PizzaMaker(lock, condition, "Pizza Maker " + (i + 1)));
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Ingredients are ready, everyone place them on pizza...");
lock.lock();
condition.signalAll();
lock.unlock();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Ingredients are on pizza, put them into oven and start baking...");
lock.lock();
condition.signalAll();
lock.unlock();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("The pizza is baked, take it out of the oven...");
lock.lock();
condition.signalAll();
lock.unlock();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("The pizza is ready, let's cut it...");
lock.lock();
condition.signalAll();
lock.unlock();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Sauce is ready, put it on pizza please...");
lock.lock();
condition.signalAll();
lock.unlock();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Enjoy the pizza!");
service.shutdown();
}
}
以上代码是一个使用 Java 语言实现的披萨问题解决方案。其中使用了线程池和锁、条件变量等同步机制,实现了多个线程同步协作完成一次完整的披萨制作过程。