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

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

class Bee extends Thread{
    private String name ;  //蜜蜂的名字,代号
    private java.util.List jar ;  //蜜罐
    final static int MAX = 10 ; //蜜罐的最大容量
    //构造函数
    public Bee(String name,java.util.List 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 jar ;  //蜜罐
    public Bear(String name, java.util.List 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 jar = new java.util.ArrayList();
        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

你可能感兴趣的:(生产者消费问题(熊蜜蜂案例))