• Java


    1、wait()惯用法:wait()包装在一个while语句中,因为某个其他任务可能会在WaitPerson被唤醒时,会突然插足并拿走订单;

    2、只能在同步控制方法或同步控制块里调用wait()、notify()和notifyAll();

    import java.util.concurrent.*;
    
    public class Meal {
            private final int orderNum;
            public Meal(int orderNum){
                this.orderNum=orderNum;
            }
            public String toString(){
                return "Meal "+orderNum;
            }
    }
    
    public class Restaurant {
        Meal meal;
        ExecutorService exec=Executors.newCachedThreadPool();
        WaitPerson waitPerson=new WaitPerson(this);
        Chef chef=new Chef(this);
        
        public Restaurant(){
            exec.execute(waitPerson);
            exec.execute(chef);
        }
    }
    
    public class WaitPerson implements Runnable{
    
        private Restaurant restaurant;
        public  WaitPerson(Restaurant r) {
            restaurant=r;
        }
        
        @Override
        public void run() {
            try{
                while(!Thread.interrupted()){
                    synchronized (this) {
                        while(restaurant.meal==null){
                            wait(); // for the chef to produce a meal
                        }
                    }
                    System.out.println("WaitPerson got "+restaurant.meal);
                    
                    synchronized(restaurant.chef){
                        restaurant.meal=null;
                        restaurant.chef.notifyAll(); 
                    }
                }
            }catch(InterruptedException e){
                System.out.println("WaitPerson interrupted");
            }    
        }
    }
    
    public class Chef implements Runnable {
    
        private Restaurant restaurant;
        private int count=0;
        public Chef(Restaurant r){
            restaurant=r;
        }
        
        @Override
        public void run() {
            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.print("Order up! ");
                    
                    synchronized(restaurant.waitPerson){
                        restaurant.meal=new Meal(count);
                        restaurant.waitPerson.notifyAll();
                    }
                    
                    //TimeUnit.MILLISECONDS.sleep(100);
                }
            }catch(InterruptedException e){
                System.out.println("Chef interrupted");
            }
        }
    }
  • 相关阅读:
    迭代器(iterator)
    Vector/Push_back
    fprintf()、sprintf()、printf()、fwrite()函数的用法与区别
    快速删除node_modules的方法
    iView动态生成Menu时open-names不生效的解决办法
    CSS3绘制各类图形总结
    Node在一线企业中的运用(转)
    content属性为中文时导致html页面乱码问题
    深入理解CSS:line-height、vertical-align
    npm私有仓库(基于nexus2搭建)使用手册
  • 原文地址:https://www.cnblogs.com/null2/p/5089219.html
Copyright © 2020-2023  润新知