一、对生产者消费者的理解

生产者消费者模式是并发、多线程编程中经典的设计模式。

简单来看,就是一个类负责生产,一个类负责消费。举例来说,一个变量,生产者不断增加这个变量,消费者不断减少这个变量。在互联网应用中,抢票机制就是应用了该模式,比如大麦网演唱会门票抢票,12306火车票抢票等。

二、代码演示

下面使用代码来举例理解:

有这样一个场景:

生产者:往一个公共的盒子里面放苹果
消费者:从公共的盒子里面取苹果
盒子:盒子的容量不能超过5

我们将使用wait() 和 notify() 通信方法实现

1.盒子代码

    public class PublicBox { private int apple = 0;     public synchronized void increace() { while (apple ==5) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } apple++; System. out .println("生成苹果成功!" );notify(); }       public synchronized void decreace() { while (apple ==0) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } apple--; System. out.println( "消费苹果成功!" );notify(); } public static void main(String []args){PublicBox box= new PublicBox();Consumer con= new Consumer(box);Producer pro= new Producer(box);Thread t1= new Thread(con);Thread t2= new Thread(pro);t1.start();t2.start();                                       }}

2.生产者代码(定义十次)

public class Producer implements Runnable { private PublicBox box; public Producer(PublicBox box) { this .box = box; } @Override public void run() { for( int i=0;i<10;i++)  {try {System. out .println("pro  i:" +i);Thread. sleep(30);} catch (InterruptedException e) {// TODO: handle exceptione.printStackTrace();}box.increace(); }}
}

3.消费者代码(同样十次)

public class Consumer implements Runnable { private PublicBox box; public Consumer(PublicBox box) { this .box = box; } @Override public void run() { for( int i=0;i<10;i++){try {System. out .println("Con: i " +i);Thread. sleep(3000);                // 这里设置跟上面30不同是为了 盒子中的苹果能够增加,不会生产一个马上被消费  } catch (InterruptedException e) {// TODO: handle exceptione.printStackTrace();}box.decreace(); } }
}

4.输出如下:

pro i:0
Con: i 0
生成苹果成功!
pro i:1
生成苹果成功!
pro i:2
生成苹果成功!
pro i:3
生成苹果成功!
pro i:4
生成苹果成功!
pro i:5
消费苹果成功!
Con: i 1
生成苹果成功!
pro i:6
消费苹果成功!
Con: i 2
生成苹果成功!
pro i:7
消费苹果成功!
生成苹果成功!
pro i:8
Con: i 3
消费苹果成功!
生成苹果成功!
pro i:9
Con: i 4
消费苹果成功!
生成苹果成功!
Con: i 5
消费苹果成功!
Con: i 6
消费苹果成功!
Con: i 7
消费苹果成功!
Con: i 8
消费苹果成功!
Con: i 9
消费苹果成功!
这个只是简单地从线程的wait、nofity来实现生产者和消费者模式。目前比较流行的是使用消息队列的方法

java实现生产者和消费者 类比消息中间件相关推荐

  1. Java多线程-生产者与消费者

    Java多线程生产者与消费者,准确说应该是"生产者-消费者-仓储"模型,使用了仓储,使得生产者消费者模型就显得更有说服力. 对于此模型,应该明确一下几点: 1.生产者仅仅在仓储未满 ...

  2. Java中生产者和消费者总结

    生产者和消费者问题是线程模型中的经典问题,生产者和消费者在同一时间段共用同一个存储空间,这个存储空间是一个缓冲区的仓库,生产者可以将产品放入仓库,消费者可以从仓库中取出产品. 生产者/消费者模型是基于 ...

  3. Java中生产者与消费者问题的演变

    想要了解更多关于Java生产者消费者问题的演变吗?那就看看这篇文章吧,我们分别用旧方法和新方法来处理这个问题. 生产者消费者问题是一个典型的多进程同步问题. 对于大多数人来说,这个问题可能是我们在学校 ...

  4. java多线程生产者与消费者问题_Java多线程详解之四:生产者消费者问题

    一.问题描述 生产者消费者问题(Producer-Consumer problem),也称有限缓冲区问题(Bounded-buffer promblem),是一个多线程同步问题的经典案例.对于一个固定 ...

  5. java多线程生产者与消费者案例_多线程操作实例——生产者与消费者

    面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者- ...

  6. java多线程生产者与消费者问题_java多线程实现生产者与消费者问题

    生产者与消费者多线程实现,首先的问题就是同步,就是关于临界资源的访问 我们首先来定义一个临界资源类,这里设为Q class Q { int z=4; } 这个int型的z就是我假设的临界资源的个数 然 ...

  7. java线程----生产者和消费者问题

    package com.com.henu; /* 定义一个售货员类,作为生产者与消费者的中间类*/ public class Clerk {private int product = 0;public ...

  8. java实现生产者和消费者模式

    2019独角兽企业重金招聘Python工程师标准>>> 1.首先写生产者消费者的类 package sunhuaili; import java.util.concurrent.lo ...

  9. Java 多线程-生产者、消费者

    一.整体代码 ThreadDemo.java public class ThreadDemo { public static void main(String[] args) { Godown god ...

最新文章

  1. uni-app 封装企业微信config
  2. python安装教程32位-python为什么要装32位的
  3. jquery 视觉特效(幻灯片效果)
  4. java 常量池 和 堆 的关系_Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)...
  5. oracle1461,Oracle 10.2.0.3的ORA-1461错误
  6. 阿里云服务器域名解析
  7. Node.js设置CORS跨域请求中多域名白名单的方法
  8. DEEPIN搭建J2EE时遇到This program requires DISPLAY en...
  9. 使用Axis,在webservice的服务器端如何取到客户端的IP地址
  10. 请领导审阅并提意见应怎么说_成功的领导是怎样跟下属沟通的?在交谈的时候,应当注意这三点...
  11. Js中Array数组学习总结
  12. 【EXLIBRIS】名副其实
  13. require.context()的用法
  14. 物联网技术概论:第7章
  15. EFR32晶体校准指南
  16. 如何将网站发布和部署到本地服务器详细教程
  17. python使用_获取常用特定日期(如去年/季度/当月/上月/本周/首日等)
  18. JavaScript 计算星座和生肖
  19. 专访邦盛科技CEO王新宇:实时智能决策驱动“热数据” 价值绽放 | 爱分析访谈
  20. Nessus-7.0.1下载与应用

热门文章

  1. 传输线的波阻抗与特征阻抗
  2. matlab社会统计学,浅谈MATLAB在统计学实验教学中的应用
  3. python提取pdf表格数据并保存到excel中
  4. 边缘计算设备与部署方案
  5. C#中HP-Socket通信组件详解
  6. Mybatis Mysql 批量插入返回id
  7. 【超图+CESIUM】【基础学习使用】01、前置学习资料
  8. 《算法导论3rd第十九章》斐波那契堆
  9. word文档中enter到下一页
  10. php使用ZipArchive扩展实现文件的zip压缩与zip解压