生產者消費問題2(熊蜜蜂案例)

/**
* 生產者消費者問題.(蜜蜂Bee,熊Bear)
* 蜜蜂產蜜到罐子中,產滿進入等待并通知熊大熊二來吃漓帅。
* 熊從罐子里吃蜂蜜,罐子不足10L時等待.攢滿10L時吃.
* 罐子在某一時刻只能被熊或蜜蜂獨占(synchronized同步).
* 由于可能產生死鎖,解決方案(1.等待一段時間后重新?lián)屨?2.notifyAll 多人強占)
*/

class Bee extends Thread{
    private String name ;  //蜜蜂的名字,代號
    private java.util.List<Integer> jar ;  //蜜罐
    final static int MAX = 10 ; //蜜罐的最大容量L
    //構造函數(shù)
    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.notify();
                        jar.wait();
                    }
                    catch(Exception e){
                    }
                }
                else{                   //蜜罐沒滿就產蜜并與熊搶占蜜罐
                    jar.add(new Integer(size+1));
                    System.out.println(name+"產蜜 +1 總:"+jar.size()+"L");
                }               
            }
            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 < 10){          //如果蜜罐空了就等待
                    try{
                        jar.wait();
                    }
                    catch(Exception e){

                    }
                }
                else{   
                    for(int i = 9 ;i >=0 ; i--){
                        jar.remove(i);
                    }
                    System.out.println(name+"吃蜜 : "+jar.size());
                    jar.notifyAll();  //notifyAll
                    try{
                        jar.wait();
                    }
                    catch(Exception e){

                    }
                }
            }
            yield();   //謙讓
        }
    }
}


class BearEatHoney{
    public static void main(String[] args) {
        java.util.List<Integer> jar = new java.util.ArrayList<Integer>();
        Bear bear1 = new Bear("Bear1",jar);
        Bear bear2 = new Bear ("Bear2",jar);
        Bee bee1 = new Bee("Bee1",jar);
        Bee bee2 = new Bee("Bee2",jar);
        Bee bee3 = new Bee("Bee3",jar);
        Bee bee4 = new Bee("Bee4",jar);
        Bee bee5 = new Bee("Bee5",jar);
        Bee bee6 = new Bee("Bee6",jar);
        Bee bee7 = new Bee("Bee7",jar);
        Bee bee8 = new Bee("Bee8",jar);
        Bee bee9 = new Bee("Bee9",jar);
        Bee bee10 = new Bee("Bee10",jar);
        
        bear1.start();
        bear2.start();
        bee1.start();
        bee2.start();
        bee3.start();
        bee4.start();
        bee5.start();
        bee6.start();
        bee7.start();
        bee8.start();
        bee9.start();
        bee10.start();
    }
}

結果:

Bee9產蜜 +1 總:1L
Bee4產蜜 +1 總:2L
Bee9產蜜 +1 總:3L
Bee4產蜜 +1 總:4L
Bee8產蜜 +1 總:5L
Bee4產蜜 +1 總:6L
Bee8產蜜 +1 總:7L
Bee2產蜜 +1 總:8L
Bee4產蜜 +1 總:9L
Bee3產蜜 +1 總:10L
Bear1吃蜜 : 0
Bee3產蜜 +1 總:1L
Bee6產蜜 +1 總:2L
Bee3產蜜 +1 總:3L
Bee1產蜜 +1 總:4L
Bee6產蜜 +1 總:5L
Bee7產蜜 +1 總:6L
Bee1產蜜 +1 總:7L
Bee10產蜜 +1 總:8L
Bee7產蜜 +1 總:9L
Bee10產蜜 +1 總:10L
Bear2吃蜜 : 0
Bee8產蜜 +1 總:1L
Bee7產蜜 +1 總:2L
Bee8產蜜 +1 總:3L
Bee1產蜜 +1 總:4L
Bee7產蜜 +1 總:5L
Bee6產蜜 +1 總:6L
Bee8產蜜 +1 總:7L
Bee1產蜜 +1 總:8L
Bee7產蜜 +1 總:9L
Bee3產蜜 +1 總:10L
Bear2吃蜜 : 0
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末睛蛛,一起剝皮案震驚了整個濱河市将宪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌物赶,老刑警劉巖白指,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酵紫,居然都是意外死亡告嘲,警方通過查閱死者的電腦和手機错维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橄唬,“玉大人赋焕,你說我怎么就攤上這事⊙龀” “怎么了隆判?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缸血。 經(jīng)常有香客問我蜜氨,道長,這世上最難降的妖魔是什么捎泻? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮埋哟,結果婚禮上笆豁,老公的妹妹穿的比我還像新娘。我一直安慰自己赤赊,他們只是感情好闯狱,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抛计,像睡著了一般哄孤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吹截,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天瘦陈,我揣著相機與錄音,去河邊找鬼波俄。 笑死晨逝,一個胖子當著我的面吹牛,可吹牛的內容都是我干的懦铺。 我是一名探鬼主播捉貌,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冬念!你這毒婦竟也來了趁窃?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤急前,失蹤者是張志新(化名)和其女友劉穎醒陆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叔汁,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡统求,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年检碗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片码邻。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡折剃,死狀恐怖,靈堂內的尸體忽然破棺而出像屋,到底是詐尸還是另有隱情怕犁,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布己莺,位于F島的核電站奏甫,受9級特大地震影響,放射性物質發(fā)生泄漏凌受。R本人自食惡果不足惜阵子,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胜蛉。 院中可真熱鬧挠进,春花似錦、人聲如沸誊册。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽案怯。三九已至君旦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘲碱,已是汗流浹背金砍。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悍汛,地道東北人捞魁。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像离咐,于是被迫代替她去往敵國和親谱俭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容