和尚吃馒头
30个和尚,100个馒头,每个和尚至少吃一个馒头,最多不过4个馒头.
满足上述条件下,尽快将馒头吃完。
思路:开启多线程,以最快的速度抢占馒头,首先抢到4个馒头的线程就停止掉;当剩余的馒头数和没有吃到馒头的和尚个数相等时,只允许没有吃到馒头的和尚可以拿到馒头。
public class MonkEatBread {
//创建一个发馒头的老板,来掌控发馒头的规则
static class Boss{
//馒头数
private int breadNo = 100;
//没拿到馒头的和尚数
private int monkNo = 30;
public Boss(){}
//创建一个发馒头的控制方法
public synchronized int give(int n){
//发出成功一个馒头就返回1,否则返回0;
int tmp = 0 ;
//当馒头数大于没拿馒头的和尚数,且和尚拿到的馒头数小于4时随便拿
if(breadNo > monkNo && n<4 ){
breadNo--;
if (n==0){
monkNo--;
}
tmp = 1;
}else{
//当和尚数和馒头数相等时只能把馒头发给没有拿过馒头的和尚
if (breadNo == monkNo && n==0 && breadNo > 0){
breadNo--;
monkNo--;
tmp = 1;
}
}
return tmp;
}
}
//创建和尚线程
static class Monk extends Thread{
private String mName;
//可以吃的最大馒头数
private int max = 4;
//要吃的最少馒头数
private int min = 1;
//计数,拿了多少个馒头
private int n=0;
private Boss boss;
public Monk(String mName,Boss boss) {
this.mName = mName;
this.boss = boss;
}
//run方法
public void run (){
for (;;){
if(boss.give(n) == 1){
n++;
}else{
System.out.println(mName + "共拿了" + n + "个馒头");
break;
}
}
}
}
public static void main(String[] args) {
Boss boss =new Boss();
for(int i = 1; i <=30;i++){
new Monk("和尚"+i,boss).start();
}
}
}