• 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");
            }
        }
    }
  • 相关阅读:
    (转)当别人努力的时候,你在做什么?
    《IT项目管理》读书笔记(9) —— 项目风险管理
    线程通信机制之定时器队列
    处理控制台事件消息
    C++常见内存错误及解决方案
    WCF与现行分布式通讯技术性能对比
    (译)如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)
    常用性能计数器说明
    有关WCF公布IDataRead的问题
    负载均衡
  • 原文地址:https://www.cnblogs.com/null2/p/5089219.html
Copyright © 2020-2023  润新知