和尚吃馒头问题
- 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();
}
}
}