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();
        }
    }
}
发布了66 篇原创文章 · 获赞 21 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_35753140/article/details/100170421