Java 多線程實現和尚喫饅頭的問題

和尚喫饅頭問題

  • 30和尚,100個饅頭,每個和尚最多喫4個饅頭,最少喫1個饅頭,一次只能喫1個饅頭。
  • 滿足上述條件,儘快喫光饅頭。

注意

合適沒喫一個饅頭之後要 yield(),不然他會連續喫滿4個饅頭才撒嘴。

代碼

Monk.java

class Monk extends Thread{
    private String monkName;
    private Boss boss;
    int monkEated = 0;
    private String eatedBread = "";

    Monk(String monkName, Boss boss){
        this.monkName = monkName;
        this.boss = boss;
    }

    @Override
    public void run() {
        while(true) {
            int tmp = boss.getBread(this);
            if(tmp != 0) {
                monkEated++;
                eatedBread += "," + tmp;
                this.yield();
            }else{
                System.out.println(monkName + "eat: " + eatedBread);
                break;
            }
        }
    }
}

Boss.java

class Boss {
    private int breads = 100;
    private int eatedMonks = 0;

    synchronized int getBread(Monk monk) {
        if (monk.monkEated == 0) {
            eatedMonks++;
            return breads--;
        }
        if(monk.monkEated == 4){
            return 0;
        }
        if (breads > 30 - eatedMonks) {
            return breads--;
        }
        return 0;
    }
}

App.java

public class App {
    public static void main(String[] args) {
        Boss boss = new Boss();
        for(int i=1;i<=30;i++){
            new Monk("monk"+i, boss).start();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章