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

8 篇文章 0 订阅
5 篇文章 0 订阅

和尚吃馒头

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

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值