美文网首页
生产者消费问题(熊蜜蜂案例)

生产者消费问题(熊蜜蜂案例)

作者: 懵智的大仁哥 | 来源:发表于2016-03-04 22:55 被阅读102次

    /**
    * 生产者消费者问题.(蜜蜂Bee,熊Bear)
    * 蜜蜂产蜜到罐子中,产满进入等待.未满时与熊争抢罐子.
    * 熊从罐子里吃蜂蜜,罐子空时等待.有蜂蜜时与蜜蜂抢罐子.
    * 罐子在某一时刻只能被熊或蜜蜂独占(synchronized同步).
    * 由于可能产生死锁,解决方案(1.等待一段时间后重新抢占 2.notifyAll 多人强占)
    */

    class Bee extends Thread{
        private String name ;  //蜜蜂的名字,代号
        private java.util.List<Integer> jar ;  //蜜罐
        final static int MAX = 10 ; //蜜罐的最大容量
        //构造函数
        public Bee(String name,java.util.List<Integer> jar){
            this.name = name ;
            this.jar = jar ;
        }
        //线程方法
        public void run(){
            while(true){
                synchronized(jar){      //对蜜罐进行独占同步
                    int size = jar.size();
                    if(size==MAX){          //如果蜜罐满了,就停止产蜜
                        try{
                            jar.wait();
                        }
                        catch(Exception e){
                        }
                    }
                    else{                   //蜜罐没满就产蜜并与熊抢占蜜罐
                        System.out.println(name+" : "+jar.size());
                        jar.add(new Integer(size));
                        jar.notify();  //notifyAll
                    }               
                }
                yield();                    //谦让一下
            }
        }
    }
    
    
    class Bear extends Thread{
        private String name ;       //熊的名字,代号
        private java.util.List<Integer> jar ;  //蜜罐
        public Bear(String name, java.util.List<Integer> jar){
            this.name = name ;
            this.jar = jar ;
        }
        //线程代码
        public void run(){
            while(true){
                synchronized(jar){           //对蜜罐进行独占同步
                    int size = jar.size();
                    if(size == 0){          //如果蜜罐空了就等待
                        try{
                            jar.wait();
                        }
                        catch(Exception e){
    
                        }
                    }
                    else{                   //如果蜜罐不空就吃蜂蜜,并继续与蜜蜂抢占蜜罐
                        System.out.println(name+" : "+jar.size());
                        try{
                            sleep(250);
                        }
                        catch(Exception e){
                        }
                        jar.remove(0);
                        jar.notify();  //notifyAll
                    }
                }
                yield();   //谦让
            }
        }
    }
    
    
    class BearEatHoney{
        public static void main(String[] args) {
            java.util.List<Integer> jar = new java.util.ArrayList<Integer>();
            Bee bee = new Bee("Bee",jar);
            Bear bear = new Bear ("Bear",jar);
            bee.start();
            bear.start();  
        }
    }
    

    结果:

    Bee : 0
    Bee : 1
    Bear : 2
    Bear : 1
    Bee : 0
    Bee : 1
    Bear : 2
    Bee : 1
    Bee : 2
    Bear : 3
    Bee : 2
    Bear : 3
    Bee : 2
    Bear : 3
    Bee : 2
    Bear : 3
    Bee : 2
    Bee : 3
    Bear : 4

    相关文章

      网友评论

          本文标题:生产者消费问题(熊蜜蜂案例)

          本文链接:https://www.haomeiwen.com/subject/sxwokttx.html