import java.util.concurrent.*;
class Meal{
private final int orderNum;
public Meal(int orderNum){
this.orderNum = orderNum;
}
public String toString(){
return "Meal " + orderNum;
}
}
class WaitPerson implements Runnable{
private Restaurant restaurant;
public WaitPerson(Restaurant restaurant){
this.restaurant = restaurant;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(!Thread.interrupted()){
synchronized(this){
while(restaurant.meal == null)
wait();
}
System.out.println("WaitPerson got " + restaurant.meal);
synchronized(restaurant.chef){
restaurant.meal = null;
restaurant.chef.notifyAll();
}
}
}catch(InterruptedException e){
System.out.println("WaitPerson interrupted");
}
}
}
class Chef implements Runnable{
private Restaurant restaurant;
private int count = 0;
public Chef(Restaurant restaurant){
this.restaurant = restaurant;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(!Thread.interrupted()){
synchronized(this){
while(restaurant.meal != null)
wait();
}
if(++count == 10){
System.out.println("Out of food. closing");
restaurant.exec.shutdownNow();
}
System.out.println("Order up!");
synchronized(restaurant.waitPerson){
restaurant.meal = new Meal(count);
restaurant.waitPerson.notifyAll();
}
TimeUnit.MILLISECONDS.sleep(10);
}
}catch(InterruptedException e){
System.out.println("Chef interrupted"); // 如果在sleep中收到终端信号会走这里,否则直接从while退出
}
}
}
public class Restaurant {
Meal meal;
ExecutorService exec = Executors.newCachedThreadPool();
WaitPerson waitPerson = new WaitPerson(this);
Chef chef = new Chef(this);
public Restaurant(){
exec.execute(chef);
exec.execute(waitPerson);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Restaurant();
}
}