`

简单生产者-消费者

阅读更多
考虑一个场景:一个饭店有一个厨师和一个服务员。菜做好之后,厨师通知服务员端菜,服务员端完菜之后厨师才能做菜。

代码如下:



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();
 }
 

}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics