恭喜辛勤的鱼摊主今日生意火热,瞬间就售空掉捕捞到的鱼。

这里我们把卖鱼当作产出方,顾客当作消费方,其实就是个生产与消费的例子。而生产与消费无处不在,工厂生产玩偶,消费者购买玩偶;餐厅里厨师炒菜,食客吃菜;市场买菜的阿姨卖菜,妈妈们去买菜等等。

假若生产的商品放置于仓库(鱼摊主捕鱼将鱼放置于鱼篓),那么仓库(鱼篓)肯定有个上限,而当仓库无商品(鱼篓无鱼)时候,消费者也无处消费。

我们又如何确保,仓库(鱼篓)满的时候生产者(鱼摊主)停止生产(捕鱼)直到仓库(鱼篓)可以继续存放商品(鱼),仓库(鱼篓)空的时候消费者停止消费直到仓库(鱼篓)又库存(有鱼)?

生产者和消费者是两个独立的并发事件,生产者(鱼摊主他老婆也去捕鱼啦!)生产商品的同时消费者也可能在消费商品。

生产与消费是多线程的经典例子之一,主要涉及到

1.线程等待唤醒

2.同步锁机制

那么我们来看看代码是如何现实的?(注释的地方请注意下)

    public static class Producer implements Runnable{private List<Object> goods;private String name;public Producer(List<Object> goods,String name){this.name = name;this.goods = goods;}public void product() throws InterruptedException {synchronized (goods){//synchronized同步锁goodswhile(goods.size()==10){System.out.println(Thread.currentThread().getName()+" "+name+" "+" goods is full");goods.wait();//线程进入等待状态,并且释放锁goods}//商品没有满或者处于等待状态的某生产线程唤醒后,执行以下代码goods.add(new Object());System.out.println(Thread.currentThread().getName()+" "+name+" product,now goods'count is "+goods.size());goods.notifyAll();//唤醒在等待的线程}}@Overridepublic void run() {try {product();} catch (InterruptedException e) {e.printStackTrace();}}}public static class Consumer implements Runnable{private List<Object> goods;private String name;public Consumer(List<Object> goods,String name){this.name = name;this.goods = goods;}public void consume() throws InterruptedException {synchronized (goods){//synchronized同步锁goodswhile(goods.size()==0){System.out.println(Thread.currentThread().getName()+" "+name+" "+" goods is empty");goods.wait();//线程进入等待状态,释放锁goods;}//商品没有空或者处于等待状态的某消费线程唤醒后,执行以下代码goods.remove(0);System.out.println(Thread.currentThread().getName()+"  "+name+" consume,now goods'count is "+goods.size());goods.notifyAll();//唤醒在等待的线程}}@Overridepublic void run() {try {consume();} catch (InterruptedException e) {e.printStackTrace();}}}
}

输出结果(结果顺序不一定相同)

Thread-0 Producer1 product,now goods'count is 1
Thread-1  Consumer1 consume,now goods'count is 0
Thread-2 Consumer2  goods is empty
Thread-3 Consumer3  goods is empty
Thread-4 Producer2 product,now goods'count is 1
Thread-3  Consumer3 consume,now goods'count is 0
Thread-2 Consumer2  goods is empty

本文就只用这个wait/notifyAll来实现生产与消费,但其实还有很多种实现方式,大家可以自己思考下。

从这个多线程经典例子中可以学习到很多有趣的或者你忽略的点。

谢谢大家观阅!

本人公众号程序员七猫,不定期更新!

感谢您的喜欢

请多多关注和支持!

漫画:卖鱼与买鱼之生产与消费相关推荐

  1. 有鱼上钩!卖鱼!卖鱼!

    点击开始游戏! 一夜暴富将不再是梦! 卖鱼的话可以随时进行的 比如在[我的道具]里 点击一条鱼 卖掉的话 可以获得[忧郁]的同时 却会被收[手续费](这破游戏真是充满了忧郁啊!) 有了[忧郁]的话 就 ...

  2. kafka java_Kafka 使用Java实现数据的生产和消费demo

    前言 在上一篇中讲述如何搭建kafka集群,本篇则讲述如何简单的使用 kafka .不过在使用kafka的时候,还是应该简单的了解下kafka. Kafka的介绍 Kafka是一种高吞吐量的分布式发布 ...

  3. 【专题介绍】视频内容生产与消费创新(Part2)

    " "音视频+无限可能"是一扇 LiveVideoStackCon面向新兴领域开启的大门,在移动互联网红利消失.内卷的局面下,智能车.制造.金融.医疗.出海等新兴领域还在 ...

  4. 【专题介绍】视频内容生产与消费创新(Part1)

    " "音视频+无限可能"是一扇 LiveVideoStackCon面向新兴领域开启的大门,在移动互联网红利消失.内卷的局面下,智能车.制造.金融.医疗.出海等新兴领域还在 ...

  5. 多线程-单生产单消费模型

    2019独角兽企业重金招聘Python工程师标准>>> 创建资源对象,提供保存和取出方法(使用synchronized代码块实现) /*** Created by shaoqingh ...

  6. KAFKA 最新版 Shell API单机生产与消费

    文章目录 一.KAFKA 启动与监控 二.KAFKA 主题创建于查看生产与消费 2.1. 查看主题列表 2.2. 创建主题 2.3. 查看主题信息 2.4. 主题信息分析 三.KAFKA 主题创建于查 ...

  7. Kafka2.12安装与配置/生产与消费

    Kafka2.12安装与配置/生产与消费 一.Kafka安装与配置 1.1 Java环境为前提 jdk下载地址链接:jdk1.8 提取码:9plz zookeeper下载地址链接:zookeeper3 ...

  8. 获取props里面的数据_Kafka 使用Java实现数据的生产和消费demo

    Kafka的介绍 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. Kafka 有如下特性: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB ...

  9. 23.生产与消费模型

    实际生活中,需要操作共享的某个资源(水池),但是对这个共享资源的操作方式不同(部分是注水[生产].部分是抽水[消费]).把这种现象我们可以称为生产和消费模型. 生产:它可以采用部分线程进行模拟.多个线 ...

最新文章

  1. 【综述】闲话模型压缩之网络剪枝(Network Pruning)
  2. 深度|人工智能赋能“新基建”产业的四方面及建议
  3. vim中执行shell命令小结
  4. 不用vim-airline/lightline.vim, 如何使用纯手工制作一个漂亮的 vim 状态栏
  5. 如何修改pdf文件的背景色
  6. 一文读懂什么是Java中的自动拆装箱
  7. 无法解析的外部符号的几种可能(lib方面的)(还有dll方面的,不在本文中)...
  8. java学习(47):带参无返回
  9. mysql 存树 闭包表_关系型数据库树形关系存储-闭包表
  10. WinINet function(2)Request
  11. 解读30个提高Web程序执行效率的好经验
  12. jquery-validation 使用
  13. Spark面试:Spark on yarn 运行流程
  14. 谷粒商城:06. 前端开发基础知识
  15. 设计模式 ( 二 ) 简单工厂模式
  16. 第2次作业:微博软件分析
  17. 登录harbor时的SSL异常: x509: certificate is valid for ingress.local
  18. 微信公众号开发--实现扫码关注公众号自动登录网站
  19. 人像抠图——基于深度学习一键去除视频背景
  20. Ansys/Abaqus/nbsp;热应力分析.20…

热门文章

  1. 《 指数基金投资指南 》by 银行螺丝钉 - 笔记 - 3小尾巴~
  2. 我劝你不要再留QQ邮箱了
  3. java caller_JavaScript中callee和caller的区别与用法实例分析
  4. 腾讯云图,让数据说话
  5. 李志敏 华中农业大学计算机学院,华中农业大学计算机教育论坛举行
  6. 重磅:阿里开启大规模校招,传已启动保密项目
  7. 圣诞颂歌(Christmas Songs)
  8. Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇
  9. Connections could not be acquired from the unde...
  10. QQ群、讨论组上传文件,由于网络原因上传失败?