java -生产者和消费者模型

本文描述了一个使用Java编程实现的多线程场景,模拟了牛奶配送员和客户取牛奶的过程,通过`Box`类中的`synchronized`方法确保线程安全,展示了生产者-消费者问题的解决方案。
摘要由CSDN通过智能技术生成

多线程的方式实现下面场景

场景

一个星期有7天 工人每天往客户家里放入1瓶牛奶,工人需要判断奶箱子的里面是否存在牛奶,里面存在牛奶不能放入第2瓶子,顾客需要每天取出牛奶,以便工人能放进去

创建一个奶箱类

package com.itxs.demo08;

/**
 * @Classname : Box
 * @Description : TODO 奶箱类
 * @Author : lin_refuel@qq.com
 */
public class Box {
    private int milk;// 牛奶的数量
    private boolean emptyOrHave = false;//奶箱子的状态 true里面存在牛奶 false里面不存在牛奶

    /**
     * 奶箱子里面存放牛奶的方法
     * @param milk 牛奶的数量
     */
    public synchronized void into (int milk){
        //放入牛奶时判断奶箱子的状态
        if(emptyOrHave){
            try {
                wait(); // 如果奶箱子里面存放牛奶,进行等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 生产牛奶
            this.milk = milk;
            //放入牛奶
            System.out.println("工人放入第"+this.milk+"瓶牛奶");
            //修改奶箱子状态
            this.emptyOrHave = true;
            // 告诉客户牛奶放进下去
            notifyAll();
        }
    }
    /**
     * 客户取走牛奶
     */
    public synchronized void getMilk(){
        //判断奶箱子里面是否存在牛奶
        if(!emptyOrHave){
            try {
                wait();//当里面没有牛奶进行等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 正常取出牛奶
        System.out.println("客户取走第"+this.milk+"瓶牛奶");
        // 修改奶箱子里面的状态
        this.emptyOrHave = false;
        // 告诉工人牛奶被取走
        notifyAll();
    }
}

放入动作和取出动作

放入牛奶的线程

package com.itxs.demo08;

/**
 * @Classname : produce
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class produce implements Runnable{
    //创建奶箱对象
    Box box = new Box();

    public produce(Box box) {
        this.box = box;
    }

    @Override
    public void run() {
        // 一个星期七天 放入7瓶牛奶
        for (int i = 1; i <=7 ; i++) {
            this.box.into(i);
        }
    }
}

取出牛奶的线程

package com.itxs.demo08;

/**
 * @Classname : take
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class take implements Runnable{
    // 创建奶箱子对象
       Box box = new Box();

    public take(Box box) {
        this.box = box;
    }

    @Override
    public void run() {
        while(true) {
            box.getMilk();
        }
    }
}

测试-实现上面场景

package com.itxs.demo08;

/**
 * @Classname : test
 * @Description : TODO 测试奶箱子
 * @Author : lin_refuel@qq.com
 */
public class test {
    public static void main(String[] args) {
        Box box = new Box();// 创建奶箱对象
        // 创建工人线程
        Thread worker = new Thread(new produce(box));
        // 创建客户线程
        Thread client = new Thread(new take(box));
        // 开启两个线程
        worker.start();
        client.start();
    }
}
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值