天天看點

簡單生産者-消費者

考慮一個場景:一個飯店有一個廚師和一個服務員。菜做好之後,廚師通知服務員端菜,服務員端完菜之後廚師才能做菜。

代碼如下:

public class Meal {

 private final int orderNum;
  public Meal(int orderNum) {
  // TODO Auto-generated constructor stub
   this.orderNum=orderNum;
 }

  @Override
 public String toString() {
  // TODO Auto-generated method stub
  return "Meal "+orderNum;
 }
}
           

===================廚師類

public class Chef implements Runnable{

 private Restaurant restaurant;
 private int count=0;


 public Chef(Restaurant r) {
  // TODO Auto-generated constructor stub
  this.restaurant=r;
 }

 @Override
 public void run() {
  // TODO Auto-generated method stub
  try {
   while(!Thread.interrupted()){
    synchronized(this){
     while(restaurant.meal!=null){
      wait();
     }
     if(++count==100){
      System.out.println("Out of food ");
      restaurant.exec.shutdownNow();
     }
     System.out.println("Order up!");
     //++restaurant.num;
     //if(restaurant.num>1){
      //System.out.println("========>>>"+count);
     //}
     synchronized (restaurant.waitPerson) {
      restaurant.meal=new Meal(count);
      restaurant.waitPerson.notifyAll();
     }
     //TimeUnit.MILLISECONDS.sleep(100);

    }

   }
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   System.out.println("Chef interrupted!");
  }

 }
}
           

====================服務員類

public class WaitPerson implements Runnable{

 private Restaurant restaurant;

 public WaitPerson(Restaurant r) {
  // TODO Auto-generated constructor stub
  this.restaurant=r;
 }
 @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);
    //--restaurant.num;
    synchronized(restaurant.chef){
     restaurant.meal=null;
     restaurant.chef.notifyAll();
    }
   }
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   System.out.println("Wait Person interrupted.");
  }
 }
}
           

======================飯店類

public class Restaurant {
 // int num=0;
 Meal meal;
 ExecutorService exec=Executors.newCachedThreadPool();
 WaitPerson waitPerson=new WaitPerson(this);
 Chef chef=new Chef(this);
 public Restaurant() {
  // TODO Auto-generated constructor stub
  exec.execute(chef);
  exec.execute(waitPerson);
 }

 public static void main(String[] args){
  new Restaurant();
 }


}
           

繼續閱讀