`
fishyu0817
  • 浏览: 111170 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java设计模式之生产者消费者模式

阅读更多

转载

 

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一 样,Hello World!都是最经典的例子。

  实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。

  对于此模型,应该明确一下几点:

  1、生产者仅仅在仓储未满时候生产,仓满则停止生产。

  2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。

  3、当消费者发现仓储没产品可消费时候会通知生产者生产。

  4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。

  此模型将要结合java.lang.Object的wait与notify、notifyAll方法来实现以上的需求。这是非常重要的。


   /**
   * Java线程:并发协作-生产者消费者模型
  *
   * @author leizhimin 2009-11-4 14:54:36
  */
   public class Test {
  public static void main(String[] args) {
   Godown godown = new Godown(30);
   Consumer c1 = new Consumer(50, godown);
   Consumer c2 = new Consumer(20, godown);
   Consumer c3 = new Consumer(30, godown);
   Producer p1 = new Producer(10, godown);
   Producer p2 = new Producer(10, godown);
   Producer p3 = new Producer(10, godown);
   Producer p4 = new Producer(10, godown);
   Producer p5 = new Producer(10, godown);
   Producer p6 = new Producer(10, godown);
   Producer p7 = new Producer(80, godown);
  c1.start();
   c2.start();
  c3.start();
  p1.start();
  p2.start();
   p3.start();
  p4.start();
  p5.start();
  p6.start();
   p7.start();
  }
  }
  /**
  * 仓库
  */
   class Godown {
  public static final int max_size = 100; //最大库存量
   public int curnum; //当前库存量
  Godown() {
  }
   Godown(int curnum) {
  this.curnum = curnum;
  }
  /**
   * 生产指定数量的产品
  *
  * @param neednum
  */
   public synchronized void produce(int neednum) {
  //测试是否需要生产
   while (neednum + curnum > max_size) {
  System.out.println("要生产的产 品数量" + neednum + "超过剩余库存量" + (max_size - curnum) + ",暂时不能执行生产任务!");
   try {
  //当前的生产线程等待
  wait();
   } catch (InterruptedException e) {
  e.printStackTrace();
  }
   }
  //满足生产条件,则进行生产,这里简单的更改当前库存量
  curnum += neednum;
   System.out.println("已经生产了" + neednum + "个产品,现仓储量为" + curnum);
  //唤醒 在此对象监视器上等待的所有线程
  notifyAll();
  }
  /**
  * 消费指定数量的产品
   *
  * @param neednum
  */
   public synchronized void consume(int neednum) {
  //测试是否可消费
   while (curnum < neednum) {
  try {
  //当前的生产线程等待
   wait();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  }
  //满足消费条件,则进行消费,这里简单的更改当前库存量
   curnum -= neednum;
  System.out.println("已经消费了" + neednum + "个产品,现仓 储量为" + curnum);
  //唤醒在此对象监视器上等待的所有线程
  notifyAll();
  }
   }
  /**
  * 生产者
  */
  class Producer extends Thread {
   private int neednum; //生产产品的数量
  private Godown godown; //仓库
   Producer(int neednum, Godown godown) {
  this.neednum = neednum;
   this.godown = godown;
  }
  public void run() {
  //生产指定数量的 产品
  godown.produce(neednum);
  }
  }
  /**
  * 消费者
   */
  class Consumer extends Thread {
  private int neednum; //生 产产品的数量
  private Godown godown; //仓库
   Consumer(int neednum, Godown godown) {
  this.neednum = neednum;
   this.godown = godown;
  }
  public void run() {
  //消费指定数量的 产品
  godown.consume(neednum);
  }
  }

 


   已经生产了10个产品,现仓储量为40
  已经生产了10个产品,现仓储量为50
  已经消费了50个产品,现仓储量为0
   已经生产了80个产品,现仓储量为80
  已经消费了30个产品,现仓储量为50
  已经生产了10个产品,现仓储量为60
   已经消费了20个产品,现仓储量为40
  已经生产了10个产品,现仓储量为50
  已经生产了10个产品,现仓储量为60
   已经生产了10个产品,现仓储量为70
  Process finished with exit code 0

  说明:

  对于本例,要说明的是当发现不能满足生产或者消费条件的时候,调用对象的wait方法,wait方法的作用是释放当前线程的所获得的锁,并调用 对象的notifyAll() 方法,通知(唤醒)该对象上其他等待线程,使得其继续执行。这样,整个生产者、消费者线程得以正确的协作执行。

  notifyAll() 方法,起到的是一个通知作用,不释放锁,也不获取锁。只是告诉该对象上等待的线程“可以竞争执行了,都醒来去执行吧”。

  本例仅仅是生产者消费者模型中最简单的一种表示,本例中,如果消费者消费的仓储量达不到满足,而又没有生产者,则程序会一直处于等待状态,这当 然是不对的。实际上可以将此例进行修改,修改为,根据消费驱动生产,同时生产兼顾仓库,如果仓不满就生产,并对每次最大消费量做个限制,这样就不存在此问 题了,当然这样的例子更复杂,更难以说明这样一个简单模型。

分享到:
评论
1 楼 帅先勃 2012-07-28  

相关推荐

    计算机图形学之动画和模拟算法:Inverse Kinematics:游戏开发中的逆向运动学实现.docx

    计算机图形学之动画和模拟算法:Inverse Kinematics:游戏开发中的逆向运动学实现.docx

    nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本naco

    nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台启动脚本nacos 后台

    Java SpringBoot Vue 毕业设计/节课作业【10个完整项目+源码+数据库+毕设论文+视频部署讲解】

    Java 毕业设计/节课作业【10个完整项目+源码+数据库+毕设论文+视频部署讲解】, 1智能摄影分享网站系统, 2智能养老院管理系统, 3智能考编论坛网站的设计与实现, 4智能仓库管理系统, 5智能足球社区管理系统, 6智能社区物资交易互助平台, 7智能校园失物招领系统, 8智能it职业生涯规划系统--论文, 9智能javaweb的新能源充电系统pf, 10智能“共享书角”图书借还管理系统--论文

    基于python + openCV 实现的人脸识别

    【作品名称】:基于python + openCV 实现的人脸识别 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:实验环境 python 2.7 numpy 1.12.1 Pillow 4.1.1 openCV 2.4.13 人脸识别程序主要分为三个部分: 创建一个dataset:datasetCreator.py 训练识别器:trainner.py 检测器:detector.py dataset 通过摄像头每隔0.1s检测一次人脸,并将检测到的人脸储存至dataSet路径下(如果没有,需要自己创建) trainner 使用openCV自带的LBP人脸特征值提取方法对dataSet路径下的所有人脸进行识别训练 生成训练文件trainningData.yml存放在recognizer路径下 detector 使用训练后的识 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。

    BS23-287基于Python的期货程序化交易系统的设计与实现-206jhypi.zip

    本系统的开发与设计是基于vue为前端页面核心框架为django/flask,技术方面主要采用了Html、Js、CSS3、python、Mysql。 本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行,将系统所使用到的表以及数据存储到MySQL数据库中,方便对数据进行操作本课题基于WEB的开发平台 ②前端开发选择:Vue。 ②后端开发选择:python、django/flask。 ③数据库选择:MySQL。 ④开发工具选择:pycharm、Navicat for MySQL。 包含了我的信息、用户管理、期货公司管理、开户信息管理、充值信息管理、期货期货信息管理、期货投资管理、取消投资管理、投资风险管理、意见反馈、系统管理

    非常好的电子设计小软件屏幕颜色获取软件非常好用的软件.zip

    非常好的电子设计小软件屏幕颜色获取软件非常好用的软件.zip

    基于java+ssm+vue+mysql的网上房屋中介管理系统 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    springboot034基于Springboot+Vue在线商城系统设计与开发毕业源码案例设计.zip

    springboot034基于Springboot+Vue在线商城系统设计与开发毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    高校校园跑腿系统的设计app.zip

    基于安卓的毕业设计源码

    基于java+ssm+vue+mysql的小工程预算系统 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    【创新未发表】Matlab实现引力搜索优化算法GSA-Kmean-Transformer-BiLSTM负荷预测算法研究.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    操作系统核心技术全面讲解

    内容概要:本书详细介绍了操作系统的基本概念、发展历程、结构特点和关键功能。从操作系统的定义、特征、功能出发,逐步探讨其形成和发展过程,涵盖人工操作阶段、单道和多道批处理、分时操作系统等多种类型。随后深入讲解操作系统的内部结构,包括整体结构、分层结构、虚拟机结构等,并重点介绍常用的Windows、UNIX和Linux系统。此外,书中详细讨论了处理器管理、存储管理、进程同步与死锁、存储管理和网络操作系统等多个核心主题,提供了丰富的实例和思考练习。 适合人群:计算机科学专业的学生、从事计算机系统开发的技术人员,尤其是初学者和有一定基础的研发人员。 使用场景及目标:帮助读者理解操作系统的基本原理和技术细节,掌握常用操作系统的特性和应用场景,适用于课程学习和实际项目开发。 其他说明:本书内容全面,理论与实践相结合,适合作为教材和参考书使用。通过阅读本书,读者不仅可以深入了解操作系统的工作原理,还可以通过思考练习提升实际操作能力。

    springboot166基于Springboot+Vue的纺织品企业财务管理系统-毕业源码案例设计.zip

    springboot166基于Springboot+Vue的纺织品企业财务管理系统-毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    电机加减速初版.zip

    keil5:步进电机(S)曲线加减速代码

    非常好的电子设计小软件MDK3.80A非常好用的软件.zip

    非常好的电子设计小软件MDK3.80A非常好用的软件.zip

    【创新未发表】Matlab实现豪猪优化算法CPO-GRU实现风电数据预测算法研究.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    Unity Cesium打包后无法加载显示修复工具

    Unity Cesium打包后无法加载显示修复工具 # 问题 编辑器运行正常加载显示,打包后在其它机器上无法加载显示 # 修复方法 下载到问题机器,双击InstallCesium.bat 进行修复 # 支持版本 1.2.0、1.5.0、1.7.1、1.8.0、1.11.1

    【上交所-2024研报】龙元建设2024年三季度报告.pdf

    行业研究报告、行业调查报告、研报

    “人力资源+大数据+薪酬报告+涨薪调薪”

    人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。

    【发文无忧】基于蛇群优化算法SO-Kmean-Transformer-GRU实现数据回归预测算法研究Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

Global site tag (gtag.js) - Google Analytics