首先要思考一个问题:为什么要使用这种模式进行生产代码。

优点
极大的解决了代码之间的耦合程度
解释
之前我们写的代码可能是这样的,有A和B 两个功能代码处理数据,B代码的执行必须要依赖于A代码才能执行完B的功能,即A耦合于B。显然这严重影响B代码的生产,而且如果产生错误的话,也不容易及时的排查。采用生产者消费者模式,A代码将处理好的数据交给缓存区,B代码直接从缓存区拿取数据进行处理,这样就把A与B的依赖关系给简介的消除了。

举个例子
1、有3个面包师傅,每个师傅每10秒钟生产一个面包
2、并将面包放入到一个可以盛20个面包的篮子里,有5个吃面包的消费者,每每10秒钟从篮子里拿出一个面包吃掉,请设计并实现这个模型。

实现说明
通过 wait,notify,notifyAll 实现消费者生产者,要注意原子性 synchronized

import java.util.ArrayList;public class mainOffer {public static void main(String[] args) {stock stock = new stock();for (int i = 0; i < 3; i++) {new Thread(new Runnable() {@Overridepublic void run() {while (true) {stock.putOne(String.valueOf(Math.random()));}}}, "面包师傅 " + i).start();}for (int i = 0; i < 5; i++) {new Thread(new Runnable() {@Overridepublic void run() {while (true) {stock.getOne();}}}, "吃瓜群众 " + i).start();}}static class stock {/*** 最大的容量通知消费者*/private int maxMum = 20;/*** 最小的容量通知生产者*/private int minMum = 0;/*** 存储的列表*/private ArrayList<String> contain = new ArrayList<>();/*** 向里面放入东西** @param name*/public synchronized void putOne(String name) {//如果仓库中的容量大于最大容量进行线程等待try {Thread.sleep(1000L * 2);} catch (InterruptedException e) {e.printStackTrace();}while (contain.size() > maxMum) {try {//线程等待this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//定义仓库中存在的内容contain.add(name);System.out.println(" 生产者 "+ Thread.currentThread().getName()+ " 生产了 " + name+ " ,当前还剩:"+ contain.size());//唤起所有线程this.notifyAll();}/*** 向里面放入东西*/public synchronized void getOne() {//如果仓库没有低于最低容量while (contain.size() <= minMum) {try {//线程等待 等待生产者生产this.wait();} catch (InterruptedException e) {e.printStackTrace();}}String temp = contain.get(0);contain.remove(0);System.out.println(" 消费者 "+ Thread.currentThread().getName()+ " 消费了 " + temp+ " ,当前还剩:"+ contain.size());//唤起所有线程this.notifyAll();}}
}

【JAVA】生产者消费者模式相关推荐

  1. java消费者模式_基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

  2. java生产线消费者,基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

  3. java 生产者消费者模式_聊聊并发(十)生产者消费者模式

    本文首发于InfoQ   作者:方腾飞  校对:张龙 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使 ...

  4. java lock condition_Java 通过 Lock 和 竞争条件 Condition 实现生产者消费者模式

    更多 Java 并发编程方面的文章,请参见文集<Java 并发编程> 竞争条件 多个线程共享对某些变量的访问,其最后结果取决于哪个线程偶然在竞争中获胜. condition.await() ...

  5. Java并发编程实战~生产者-消费者模式

    前面我们在<Worker Thread 模式>中讲到,Worker Thread 模式类比的是工厂里车间工人的工作模式.但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就 ...

  6. java消费者生产者设计模式_java 多线程并发设计模式之四: 生产者消费者模式

    生产者消费者模式是一个经典的多线程设计模式,其核心思想是:有两类线程和一个内存缓冲区或者队列, 一类线程发起任务,并提交到队列中.另一类线程用来处理这些任务,叫做消费者线程. 这两类线程进行通信的桥梁 ...

  7. java 消费者模式 多线程_[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率...

    生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...

  8. 菜鸟学习笔记:Java提升篇8(线程2——线程的基本信息、线程安全、死锁、生产者消费者模式、任务调度)

    菜鸟学习笔记:Java提升篇8(线程2--线程的基本信息.线程安全.死锁.生产者消费者模式.任务调度) 线程的基本信息 线程同步 线程安全 死锁 生产者消费者模式 任务调度(了解) 线程的基本信息 J ...

  9. 生产者消费者模式-java原生、Disruptor实现方案

    生产者消费者模式介绍 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻 ...

  10. java consumed_Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的 真实世界中的生产者消费者模式 生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系.比如一个人正在准备食物(生产者),而另一个人正在吃(消费者) ...

最新文章

  1. oracle判断侦听状态,oracle 监听状态为BLOCKED
  2. mongodb更新数据,查找相同的id,有重复的,就更新。
  3. Mysql半双工主从复制
  4. spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战
  5. 工作298:无路由页面
  6. 使用memcache作为中间缓存区的步骤
  7. Java 笔记——在 IDEA 中使用 Maven 配置和使用 MyBatis
  8. CSS基础——CSS字体样式属性【学习笔记】
  9. Cannot change version of project facet Dynamic Web Module to 3.0
  10. Linux下解决无法远程连接数据库问题
  11. 第二篇 FPGA数字信号处理_并行FIR滤波器Verilog设计
  12. Mysql8.0修改数据库密码
  13. 计算机二级C语言怎么过
  14. jink Art儿童摄影师视频教程中文字幕
  15. 如何用Java分配一段连续的1G的内存空间?需要注意些什么?
  16. 全球首秀!真人数字人亮相元宇宙签约仪式
  17. 速学TypeScript-精简划重点手册-中册
  18. 文件十六进制编辑软件HxD Hex Editor的使用
  19. ASCP300-63B——三相电气防火限流式保护器
  20. opencv 图像金字塔及图像重建、融合

热门文章

  1. 医学自然语言处理相关资源整理
  2. 艾永亮:打造超级产品,互联网公司的风水转到哪儿了?
  3. Vuforia examples 简介
  4. 三维可视化技术的多种类型
  5. 8051单片机基础1:8051的起源
  6. 一个数如果恰好等于它的因子(因子:即能够整除的数)之和,这个数就称为“完数”。 例如 6=1+2+3 28=1+2+4+7+14 编程找出10000以内的所有完数。
  7. 筹码集中度指标公式怎么写
  8. C++中的预处理器概述
  9. 苹果cms模板_苹果cms收录好的模板有哪些?
  10. 02Linux常用的基本命令