转载

和尚吃馒头问题

问题:

  1. 总共有 93 个馒头
  2. 有 50 个和尚,每个和尚一次只能吃一个馒头,但最多只允许吃 3 个馒头
  3. 每个和尚至少吃一个馒头
  4. 看每个和尚吃了那些馒头

这个题很有意思,考的是 java 多线程。难点在于第 3 点。解决思路是将线程的争抢分为两个阶段,并用一个计数器保存有几个和尚吃过馒头了,第一阶段只允许每个和尚吃1个馒头,判断计数器值,当所有和尚都吃过1个馒头后,开始第二轮争抢。

答案:

public class MonkBread {
    @Test
    public void test() {

        Pool pool = new Pool(93,50);
        for(int i = 0;i < 50; i++) {
            Monk m = new Monk(pool,"和尚"+(i+1));
//          System.out.println("ddd");
            m.start();
        }

    }
}
class Monk extends Thread{
    public Pool pool;
    public String threadName;
    static List<Monk> monks = new ArrayList<Monk>();
    final int enough = 3;// 几个馒头可以吃饱
    public int eatenCount = 0;
    @Override
    public void run() {
        while(pool.breads > 0) {// 吃饱或者没馒头了就停止线程
            pool.getBread(this);
        }
    }
    Monk(Pool pool,String name) {
        this.pool = pool;
        this.threadName = name;
        monks.add(this);
    }
}
// 线程池,和尚
class Pool extends Object{

    public int breads;// 总共几个馒头
    private int totalMonks;// 总共有几个和尚
    private int evenEatenMonks = 0;// 已经有几个和尚吃过了
    public List<String> statistics = new ArrayList<String>();
    boolean hasStastics;

    Pool(int breads,int totalMonks) {
        this.breads = breads;// 馒头总数
        this.totalMonks = totalMonks;// 和尚总数
    }
    public synchronized void getBread(Monk monk) {
        if(breads > 0) {
            if(monk.eatenCount == 0 ) {// 这个和尚是第一次吃馒头
                breads --;// 取走一个馒头
                evenEatenMonks ++;// 记录已经吃过馒头的和尚数
                monk.eatenCount ++;
                System.out.println(monk.threadName+"吃第1个馒头。甑子里还有"+breads+"个馒头。");
                notifyAll();
            }else {
                if(evenEatenMonks >= totalMonks ) {// 所有和尚都吃过一个了
                    if(monk.eatenCount < 3) {
                        breads --;// 吃掉一个馒头
                        monk.eatenCount ++;
                        System.out.println("大家都吃过了,"+monk.threadName+"没吃饱,再吃1个馒头吧。甑子里还有"+breads+"个馒头。");
                        notifyAll();
                    }else {// 对于已经吃饱的和尚,停止线程
                        // 这个情况不存在,不用考虑
                    }

                }else {// 有的和尚还没吃过
                    System.out.println("还有其他人没吃呢,"+monk.threadName+"等等吧。甑子里还有"+breads+"个馒头。");
                    notifyAll();// 通知其它和尚吃
                    try {
                        wait();// 自己等待
                    }catch(Exception e){}
                }
            }
        }else if(hasStastics == false) {// 馒头已吃完,输出统计数字
            System.out.println("===================统计每个和尚================");
            int total = 0;
            for(int i = 0;i<Monk.monks.size();i++) {
                Monk m = Monk.monks.get(i);
                total += m.eatenCount;
                System.out.println(m.threadName+"总共吃了"+m.eatenCount+"个馒头。");
            }
            System.out.println("所有和尚总共吃了"+total+"个馒头。");
            hasStastics = true;
        }
    }

}

打印输出:

和尚1吃第1个馒头。甑子里还有92个馒头。
还有其他人没吃呢,和尚1等等吧。甑子里还有92个馒头。
和尚2吃第1个馒头。甑子里还有91个馒头。
还有其他人没吃呢,和尚2等等吧。甑子里还有91个馒头。
还有其他人没吃呢,和尚1等等吧。甑子里还有91个馒头。
还有其他人没吃呢,和尚2等等吧。甑子里还有91个馒头。
和尚3吃第1个馒头。甑子里还有90个馒头。
还有其他人没吃呢,和尚3等等吧。甑子里还有90个馒头。
还有其他人没吃呢,和尚2等等吧。甑子里还有90个馒头。
和尚5吃第1个馒头。甑子里还有89个馒头。
还有其他人没吃呢,和尚5等等吧。甑子里还有89个馒头。
和尚4吃第1个馒头。甑子里还有88个馒头。
还有其他人没吃呢,和尚4等等吧。甑子里还有88个馒头。
还有其他人没吃呢,和尚1等等吧。甑子里还有88个馒头。
还有其他人没吃呢,和尚5等等吧。甑子里还有88个馒头。
和尚6吃第1个馒头。甑子里还有87个馒头。
还有其他人没吃呢,和尚6等等吧。甑子里还有87个馒头。
还有其他人没吃呢,和尚2等等吧。甑子里还有87个馒头。
还有其他人没吃呢,和尚3等等吧。甑子里还有87个馒头。
还有其他人没吃呢,和尚6等等吧。甑子里还有87个馒头。
和尚10吃第1个馒头。甑子里还有86个馒头。
还有其他人没吃呢,和尚10等等吧。甑子里还有86个馒头。
和尚9吃第1个馒头。甑子里还有85个馒头。
还有其他人没吃呢,和尚9等等吧。甑子里还有85个馒头。
还有其他人没吃呢,和尚5等等吧。甑子里还有85个馒头。
和尚8吃第1个馒头。甑子里还有84个馒头。
还有其他人没吃呢,和尚8等等吧。甑子里还有84个馒头。
还有其他人没吃呢,和尚1等等吧。甑子里还有84个馒头。
还有其他人没吃呢,和尚4等等吧。甑子里还有84个馒头。
和尚7吃第1个馒头。甑子里还有83个馒头。
还有其他人没吃呢,和尚7等等吧。甑子里还有83个馒头。
还有其他人没吃呢,和尚4等等吧。甑子里还有83个馒头。
还有其他人没吃呢,和尚1等等吧。甑子里还有83个馒头。
和尚16吃第1个馒头。甑子里还有82个馒头。
还有其他人没吃呢,和尚16等等吧。甑子里还有82个馒头。
和尚20吃第1个馒头。甑子里还有81个馒头。
还有其他人没吃呢,和尚20等等吧。甑子里还有81个馒头。
和尚15吃第1个馒头。甑子里还有80个馒头。
还有其他人没吃呢,和尚15等等吧。甑子里还有80个馒头。
还有其他人没吃呢,和尚5等等吧。甑子里还有80个馒头。
还有其他人没吃呢,和尚9等等吧。甑子里还有80个馒头。
和尚14吃第1个馒头。甑子里还有79个馒头。
和尚23吃第1个馒头。甑子里还有78个馒头。
还有其他人没吃呢,和尚23等等吧。甑子里还有78个馒头。
和尚13吃第1个馒头。甑子里还有77个馒头。
还有其他人没吃呢,和尚13等等吧。甑子里还有77个馒头。
还有其他人没吃呢,和尚10等等吧。甑子里还有77个馒头。
和尚12吃第1个馒头。甑子里还有76个馒头。
还有其他人没吃呢,和尚12等等吧。甑子里还有76个馒头。
还有其他人没吃呢,和尚6等等吧。甑子里还有76个馒头。
还有其他人没吃呢,和尚3等等吧。甑子里还有76个馒头。
和尚11吃第1个馒头。甑子里还有75个馒头。
和尚28吃第1个馒头。甑子里还有74个馒头。
还有其他人没吃呢,和尚28等等吧。甑子里还有74个馒头。
和尚29吃第1个馒头。甑子里还有73个馒头。
还有其他人没吃呢,和尚29等等吧。甑子里还有73个馒头。
还有其他人没吃呢,和尚2等等吧。甑子里还有73个馒头。
还有其他人没吃呢,和尚28等等吧。甑子里还有73个馒头。
还有其他人没吃呢,和尚11等等吧。甑子里还有73个馒头。
还有其他人没吃呢,和尚3等等吧。甑子里还有73个馒头。
和尚27吃第1个馒头。甑子里还有72个馒头。
还有其他人没吃呢,和尚27等等吧。甑子里还有72个馒头。
还有其他人没吃呢,和尚12等等吧。甑子里还有72个馒头。
和尚26吃第1个馒头。甑子里还有71个馒头。
和尚34吃第1个馒头。甑子里还有70个馒头。
还有其他人没吃呢,和尚34等等吧。甑子里还有70个馒头。
还有其他人没吃呢,和尚13等等吧。甑子里还有70个馒头。
和尚25吃第1个馒头。甑子里还有69个馒头。
还有其他人没吃呢,和尚25等等吧。甑子里还有69个馒头。
还有其他人没吃呢,和尚23等等吧。甑子里还有69个馒头。
和尚24吃第1个馒头。甑子里还有68个馒头。
还有其他人没吃呢,和尚24等等吧。甑子里还有68个馒头。
还有其他人没吃呢,和尚14等等吧。甑子里还有68个馒头。
还有其他人没吃呢,和尚9等等吧。甑子里还有68个馒头。
还有其他人没吃呢,和尚5等等吧。甑子里还有68个馒头。
和尚22吃第1个馒头。甑子里还有67个馒头。
还有其他人没吃呢,和尚22等等吧。甑子里还有67个馒头。
和尚39吃第1个馒头。甑子里还有66个馒头。
还有其他人没吃呢,和尚39等等吧。甑子里还有66个馒头。
和尚21吃第1个馒头。甑子里还有65个馒头。
和尚40吃第1个馒头。甑子里还有64个馒头。
还有其他人没吃呢,和尚40等等吧。甑子里还有64个馒头。
还有其他人没吃呢,和尚16等等吧。甑子里还有64个馒头。
还有其他人没吃呢,和尚8等等吧。甑子里还有64个馒头。
和尚19吃第1个馒头。甑子里还有63个馒头。
还有其他人没吃呢,和尚19等等吧。甑子里还有63个馒头。
还有其他人没吃呢,和尚4等等吧。甑子里还有63个馒头。
和尚18吃第1个馒头。甑子里还有62个馒头。
还有其他人没吃呢,和尚18等等吧。甑子里还有62个馒头。
和尚17吃第1个馒头。甑子里还有61个馒头。
还有其他人没吃呢,和尚17等等吧。甑子里还有61个馒头。
还有其他人没吃呢,和尚18等等吧。甑子里还有61个馒头。
和尚44吃第1个馒头。甑子里还有60个馒头。
还有其他人没吃呢,和尚44等等吧。甑子里还有60个馒头。
还有其他人没吃呢,和尚4等等吧。甑子里还有60个馒头。
还有其他人没吃呢,和尚19等等吧。甑子里还有60个馒头。
和尚43吃第1个馒头。甑子里还有59个馒头。
还有其他人没吃呢,和尚43等等吧。甑子里还有59个馒头。
还有其他人没吃呢,和尚7等等吧。甑子里还有59个馒头。
和尚49吃第1个馒头。甑子里还有58个馒头。
还有其他人没吃呢,和尚49等等吧。甑子里还有58个馒头。
和尚42吃第1个馒头。甑子里还有57个馒头。
还有其他人没吃呢,和尚42等等吧。甑子里还有57个馒头。
还有其他人没吃呢,和尚1等等吧。甑子里还有57个馒头。
还有其他人没吃呢,和尚16等等吧。甑子里还有57个馒头。
和尚41吃第1个馒头。甑子里还有56个馒头。
还有其他人没吃呢,和尚41等等吧。甑子里还有56个馒头。
还有其他人没吃呢,和尚21等等吧。甑子里还有56个馒头。
还有其他人没吃呢,和尚39等等吧。甑子里还有56个馒头。
还有其他人没吃呢,和尚20等等吧。甑子里还有56个馒头。
还有其他人没吃呢,和尚15等等吧。甑子里还有56个馒头。
还有其他人没吃呢,和尚9等等吧。甑子里还有56个馒头。
和尚38吃第1个馒头。甑子里还有55个馒头。
还有其他人没吃呢,和尚38等等吧。甑子里还有55个馒头。
还有其他人没吃呢,和尚14等等吧。甑子里还有55个馒头。
还有其他人没吃呢,和尚24等等吧。甑子里还有55个馒头。
和尚37吃第1个馒头。甑子里还有54个馒头。
还有其他人没吃呢,和尚37等等吧。甑子里还有54个馒头。
还有其他人没吃呢,和尚23等等吧。甑子里还有54个馒头。
还有其他人没吃呢,和尚25等等吧。甑子里还有54个馒头。
和尚36吃第1个馒头。甑子里还有53个馒头。
还有其他人没吃呢,和尚36等等吧。甑子里还有53个馒头。
还有其他人没吃呢,和尚13等等吧。甑子里还有53个馒头。
和尚35吃第1个馒头。甑子里还有52个馒头。
还有其他人没吃呢,和尚35等等吧。甑子里还有52个馒头。
还有其他人没吃呢,和尚26等等吧。甑子里还有52个馒头。
还有其他人没吃呢,和尚12等等吧。甑子里还有52个馒头。
和尚33吃第1个馒头。甑子里还有51个馒头。
还有其他人没吃呢,和尚33等等吧。甑子里还有51个馒头。
还有其他人没吃呢,和尚10等等吧。甑子里还有51个馒头。
还有其他人没吃呢,和尚6等等吧。甑子里还有51个馒头。
和尚32吃第1个馒头。甑子里还有50个馒头。
还有其他人没吃呢,和尚32等等吧。甑子里还有50个馒头。
还有其他人没吃呢,和尚11等等吧。甑子里还有50个馒头。
和尚31吃第1个馒头。甑子里还有49个馒头。
还有其他人没吃呢,和尚31等等吧。甑子里还有49个馒头。
还有其他人没吃呢,和尚2等等吧。甑子里还有49个馒头。
和尚30吃第1个馒头。甑子里还有48个馒头。
还有其他人没吃呢,和尚30等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚2等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚31等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚29等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚11等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚28等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚32等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚6等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚10等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚3等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚33等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚12等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚27等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚26等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚35等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚13等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚34等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚36等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚25等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚23等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚37等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚24等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚14等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚38等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚9等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚15等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚20等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚5等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚39等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚22等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚21等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚41等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚40等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚16等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚1等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚42等等吧。甑子里还有48个馒头。
还有其他人没吃呢,和尚49等等吧。甑子里还有48个馒头。
和尚50吃第1个馒头。甑子里还有47个馒头。
还有其他人没吃呢,和尚50等等吧。甑子里还有47个馒头。
还有其他人没吃呢,和尚7等等吧。甑子里还有47个馒头。
还有其他人没吃呢,和尚8等等吧。甑子里还有47个馒头。
还有其他人没吃呢,和尚43等等吧。甑子里还有47个馒头。
和尚48吃第1个馒头。甑子里还有46个馒头。
还有其他人没吃呢,和尚48等等吧。甑子里还有46个馒头。
还有其他人没吃呢,和尚19等等吧。甑子里还有46个馒头。
和尚47吃第1个馒头。甑子里还有45个馒头。
还有其他人没吃呢,和尚47等等吧。甑子里还有45个馒头。
还有其他人没吃呢,和尚4等等吧。甑子里还有45个馒头。
和尚46吃第1个馒头。甑子里还有44个馒头。
还有其他人没吃呢,和尚46等等吧。甑子里还有44个馒头。
还有其他人没吃呢,和尚18等等吧。甑子里还有44个馒头。
和尚45吃第1个馒头。甑子里还有43个馒头。
大家都吃过了,和尚45没吃饱,再吃1个馒头吧。甑子里还有42个馒头。
大家都吃过了,和尚45没吃饱,再吃1个馒头吧。甑子里还有41个馒头。
大家都吃过了,和尚17没吃饱,再吃1个馒头吧。甑子里还有40个馒头。
大家都吃过了,和尚17没吃饱,再吃1个馒头吧。甑子里还有39个馒头。
大家都吃过了,和尚18没吃饱,再吃1个馒头吧。甑子里还有38个馒头。
大家都吃过了,和尚18没吃饱,再吃1个馒头吧。甑子里还有37个馒头。
大家都吃过了,和尚46没吃饱,再吃1个馒头吧。甑子里还有36个馒头。
大家都吃过了,和尚46没吃饱,再吃1个馒头吧。甑子里还有35个馒头。
大家都吃过了,和尚4没吃饱,再吃1个馒头吧。甑子里还有34个馒头。
大家都吃过了,和尚4没吃饱,再吃1个馒头吧。甑子里还有33个馒头。
大家都吃过了,和尚44没吃饱,再吃1个馒头吧。甑子里还有32个馒头。
大家都吃过了,和尚44没吃饱,再吃1个馒头吧。甑子里还有31个馒头。
大家都吃过了,和尚47没吃饱,再吃1个馒头吧。甑子里还有30个馒头。
大家都吃过了,和尚47没吃饱,再吃1个馒头吧。甑子里还有29个馒头。
大家都吃过了,和尚19没吃饱,再吃1个馒头吧。甑子里还有28个馒头。
大家都吃过了,和尚19没吃饱,再吃1个馒头吧。甑子里还有27个馒头。
大家都吃过了,和尚48没吃饱,再吃1个馒头吧。甑子里还有26个馒头。
大家都吃过了,和尚48没吃饱,再吃1个馒头吧。甑子里还有25个馒头。
大家都吃过了,和尚43没吃饱,再吃1个馒头吧。甑子里还有24个馒头。
大家都吃过了,和尚43没吃饱,再吃1个馒头吧。甑子里还有23个馒头。
大家都吃过了,和尚8没吃饱,再吃1个馒头吧。甑子里还有22个馒头。
大家都吃过了,和尚8没吃饱,再吃1个馒头吧。甑子里还有21个馒头。
大家都吃过了,和尚7没吃饱,再吃1个馒头吧。甑子里还有20个馒头。
大家都吃过了,和尚7没吃饱,再吃1个馒头吧。甑子里还有19个馒头。
大家都吃过了,和尚50没吃饱,再吃1个馒头吧。甑子里还有18个馒头。
大家都吃过了,和尚50没吃饱,再吃1个馒头吧。甑子里还有17个馒头。
大家都吃过了,和尚49没吃饱,再吃1个馒头吧。甑子里还有16个馒头。
大家都吃过了,和尚49没吃饱,再吃1个馒头吧。甑子里还有15个馒头。
大家都吃过了,和尚42没吃饱,再吃1个馒头吧。甑子里还有14个馒头。
大家都吃过了,和尚42没吃饱,再吃1个馒头吧。甑子里还有13个馒头。
大家都吃过了,和尚1没吃饱,再吃1个馒头吧。甑子里还有12个馒头。
大家都吃过了,和尚1没吃饱,再吃1个馒头吧。甑子里还有11个馒头。
大家都吃过了,和尚16没吃饱,再吃1个馒头吧。甑子里还有10个馒头。
大家都吃过了,和尚16没吃饱,再吃1个馒头吧。甑子里还有9个馒头。
大家都吃过了,和尚40没吃饱,再吃1个馒头吧。甑子里还有8个馒头。
大家都吃过了,和尚40没吃饱,再吃1个馒头吧。甑子里还有7个馒头。
大家都吃过了,和尚41没吃饱,再吃1个馒头吧。甑子里还有6个馒头。
大家都吃过了,和尚41没吃饱,再吃1个馒头吧。甑子里还有5个馒头。
大家都吃过了,和尚21没吃饱,再吃1个馒头吧。甑子里还有4个馒头。
大家都吃过了,和尚21没吃饱,再吃1个馒头吧。甑子里还有3个馒头。
大家都吃过了,和尚39没吃饱,再吃1个馒头吧。甑子里还有2个馒头。
大家都吃过了,和尚39没吃饱,再吃1个馒头吧。甑子里还有1个馒头。
大家都吃过了,和尚22没吃饱,再吃1个馒头吧。甑子里还有0个馒头。
===================统计每个和尚================
和尚1总共吃了3个馒头。
和尚2总共吃了1个馒头。
和尚3总共吃了1个馒头。
和尚4总共吃了3个馒头。
和尚5总共吃了1个馒头。
和尚6总共吃了1个馒头。
和尚7总共吃了3个馒头。
和尚8总共吃了3个馒头。
和尚9总共吃了1个馒头。
和尚10总共吃了1个馒头。
和尚11总共吃了1个馒头。
和尚12总共吃了1个馒头。
和尚13总共吃了1个馒头。
和尚14总共吃了1个馒头。
和尚15总共吃了1个馒头。
和尚16总共吃了3个馒头。
和尚17总共吃了3个馒头。
和尚18总共吃了3个馒头。
和尚19总共吃了3个馒头。
和尚20总共吃了1个馒头。
和尚21总共吃了3个馒头。
和尚22总共吃了2个馒头。
和尚23总共吃了1个馒头。
和尚24总共吃了1个馒头。
和尚25总共吃了1个馒头。
和尚26总共吃了1个馒头。
和尚27总共吃了1个馒头。
和尚28总共吃了1个馒头。
和尚29总共吃了1个馒头。
和尚30总共吃了1个馒头。
和尚31总共吃了1个馒头。
和尚32总共吃了1个馒头。
和尚33总共吃了1个馒头。
和尚34总共吃了1个馒头。
和尚35总共吃了1个馒头。
和尚36总共吃了1个馒头。
和尚37总共吃了1个馒头。
和尚38总共吃了1个馒头。
和尚39总共吃了3个馒头。
和尚40总共吃了3个馒头。
和尚41总共吃了3个馒头。
和尚42总共吃了3个馒头。
和尚43总共吃了3个馒头。
和尚44总共吃了3个馒头。
和尚45总共吃了3个馒头。
和尚46总共吃了3个馒头。
和尚47总共吃了3个馒头。
和尚48总共吃了3个馒头。
和尚49总共吃了3个馒头。
和尚50总共吃了3个馒头。
所有和尚总共吃了93个馒头。
原文  https://blog.csdn.net/kmyhy/article/details/80624057
正文到此结束
Loading...