Java 多线程实现蜜蜂和熊的问题

蜜蜂和熊的问题

  • 100只蜜蜂,2头熊,每只蜜蜂每次生产的蜂蜜是1,有一个罐子,容量是50
  • 罐子的蜂蜜量一旦到达20,熊就一次吃掉20

注意问题

  • 生产和消费函数在等待结束执行完生产消费逻辑后要notifyAll()
  • 生产者和消费者执行完生产消费函数后要yield()
  • 以上两点可以保证蜂蜜到达20以后熊尽快开始消费,不然总是等到罐子满了熊才开始消费。

代码

App.java

    public static void main(String[] args) throws Exception {
        HoneyPot pot = new HoneyPot();
        Bear bear1 = new Bear("bear1", pot);
        Bear bear2 = new Bear("bear2", pot);
        bear1.start();
        bear2.start();
        for(int i=1;i<=100;i++){
            new Bee(Integer.toString(i), pot).start();
        }
    }

HoneyPot.java

public class HoneyPot {
    int honey;
    private final static int capacity = 50;

    synchronized void add(int i) throws InterruptedException {
        while (honey == capacity) {
            this.wait();
        }
        honey += i;
        System.out.println("added, pot cp: " + honey);
        this.notifyAll();
    }

    synchronized void remove(int i) throws InterruptedException {
        while (honey < i) {
            this.wait();
        }
        honey -= i;
        System.out.println("removed, pot cp: " + honey);
        this.notifyAll();

    }
}

Bee.java

public class Bee extends Thread {
    private String bname;
    private HoneyPot hp;

    Bee(String bname, HoneyPot hp){
        this.bname = bname;
        this.hp = hp;
    }

    @Override
    public void run() {
        while(true){
            try {
                hp.add(1);
                System.out.println(bname + " : +1");
                this.yield();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Bear.java

public class Bear extends Thread {
    private String bname;
    private final static int drink = 20;
    private HoneyPot hp;

    Bear(String bname, HoneyPot hp) {
        this.bname = bname;
        this.hp = hp;
    }

    @Override
    public void run() {
        while (true) {
            try {
                hp.remove(drink);
                System.out.println(bname + " - : " + drink);
                this.yield();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值