问题:
这个题很有意思,考的是 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个馒头。