【代码练习4】利用多线程处理和尚吃馒头问题

和尚吃馒头

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();
        }

    }
}

你可能感兴趣的:(大数据,Java,SE,习题)