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

/**
* 生产者消费者问题.(蜜蜂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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容