读书人

简略生产者-消费者

发布时间: 2012-10-07 17:28:51 作者: rapoo

简单生产者-消费者

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

代码如下:

?

?

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

}

?

?

读书人网 >编程

热点推荐