常见场景:

某个模块负责产生数据,这些数据由另一个模块来负责处理。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。

该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据

缓冲区作用

1. 解耦,生产者和消费者只依赖缓冲区,而不互相依赖

2. 支持并发和异步

方式一,同步队列

/*** 生产者、消费者缓冲区*/
public class Storage implements IStorage {private final int maxSize = 10;private Queue<Object> queue = new LinkedList<Object>();@Overridepublic void put(Object obj) {synchronized (queue) {while (queue.size() > maxSize) {System.out.println("缓冲区已满,不能进入");try {queue.wait();} catch (InterruptedException e) {e.printStackTrace();}}queue.add(obj);System.out.println("进入缓冲区");queue.notifyAll();}}@Overridepublic Object get() {Object obj = null;synchronized (queue) {while (queue.size() <= 0) {System.out.println("缓冲区为空, 进入等待");try {queue.wait();} catch (InterruptedException e) {e.printStackTrace();}}obj = queue.poll();System.out.println("离开缓冲区");queue.notifyAll();}return obj;}
}

方式二,可重入锁

public class Storage implements IStorage {private final int maxSize = 20;private LinkedList<Object> list = new LinkedList<Object>();private final Lock lock = new ReentrantLock();// 仓库满的条件变量private final Condition full = lock.newCondition();// 仓库空的条件变量private final Condition empty = lock.newCondition();@Overridepublic void put(Object obj) {lock.lock();while (list.size() >= maxSize) {try {System.out.println("缓冲区已满,不能进入");// 生产阻塞full.await();} catch (InterruptedException e) {e.printStackTrace();}}list.add(obj);System.out.println("进入缓冲区");empty.signalAll();lock.unlock();}@Overridepublic Object get() {lock.lock();while (list.size() <= 0) {try {System.out.println("缓冲区为空, 进入等待");// 消费阻塞empty.await();} catch (InterruptedException e) {e.printStackTrace();}}Object obj = list.remove();System.out.println("离开缓冲区");full.signalAll();lock.unlock();return obj;}
}

方式三,阻塞队列

public class Storage implements IStorage {private LinkedBlockingQueue<Object> list = new LinkedBlockingQueue<Object>(10);@Overridepublic void put(Object obj) {try {list.put(obj);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("进入缓冲区");}@Overridepublic Object get() {Object obj = null;try {obj = list.take();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("离开缓冲区");return obj;}
}

转自http://www.cnblogs.com/alex09/p/6675664.html

转载于:https://www.cnblogs.com/perfei/p/7881675.html

设计模式-生产者消费者模式相关推荐

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

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

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

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

  3. 设计模式——生产者消费者模式

    1 基本概括 2 主要介绍 2.1 概念 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消 ...

  4. 设计模式—生产者消费者模式

    生产者消费者模式是指生产者和消费者通过一个缓冲区(通常是一个队列)的进行通讯.生产者生产完数据之后不用等待消费者处理,直接放到缓冲区,消费者不找生产者要数据,而是直接从缓冲区里取,这样既能够保持生产者 ...

  5. Java并发程序设计(十一)设计模式与并发之生产者-消费者模式

    设计模式与并发之生产者-消费者模式 生产者-消费者模式是一个经典的多线程设计模式.它为多线程间的协作提供了良好的解决方案. 在生产者-消费者模式中,通常由两类线程,即若干个生产者线程和若干个消费者线程 ...

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

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

  7. 并发设计模式之生产者-消费者模式

    点击查看原文: http://www.joyhwong.com/2016/11/19/并发设计模式之生产者-消费者模式/ 生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解 ...

  8. 设计模式之生产者消费者模式

    简介 通过前几篇文章的学习,我想你已经彻底掌握了wait()方法和notify()方法如何使用以及在哪种情况下使用了,本片文章我们将讲解下设计模式中的生产者消费者模式,我将通过手写一份生产者消费者模式 ...

  9. delphi生产者消费者模式代码_并发设计模式:生产者-消费者模式,并发提高效率...

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

最新文章

  1. SoundPool 音频播放 详解 示例
  2. 第八章-数据类、结构
  3. win7完整卸载oracle11,win7安装与卸载oracle11g(32)
  4. 云上创新 | 阿里云边缘云场景化商业实践
  5. android 判断byte值_Android开发之UDP可靠性传输
  6. 一个SAP成都研究院开发工程师的2020年度总结:未知生,焉知死
  7. 【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定
  8. 在集设海量拍摄配色案例 | 轻松掌握高级感配色,再也不愁没有灵感
  9. Facebook广告账号主页创建时,其实还有这些小知识!
  10. 【细节处理】LeetCode 66. Plus One
  11. ACL 2021 | 如何利用DialoGPT辅助对话摘要任务?
  12. 【CentOS 7笔记26】,打包和压缩工具的使用#171108
  13. 想要配置文件生效 需要通过添加到web.xml加载到内存中
  14. 怎么制作真人qq秀_NBA赛事最震撼的开场秀
  15. java开发职业规划
  16. 怎么使用水经注万能地图下载器制作百度兴趣点个性化地图
  17. 弱水三千,该取几瓢饮?
  18. python爬虫 | 爬取巨潮资讯上的上市公司招股说明书
  19. Python分支语句练习题
  20. PPT文档打不开提示访问出错怎么办

热门文章

  1. python在中小学教学中的应用-中小学Python教学的几点建议
  2. python基础知识资料-学习Python列表的基础知识汇总
  3. mmdetection训练出现:IndexError: list index out of range 错误
  4. Projects(子查询、连接,分组,聚合)
  5. LeetCode Super Ugly Number
  6. 优秀大数据GitHub项目一览
  7. 网络编程学习笔记(gethostname函数)
  8. BZOJ 1631: [Usaco2007 Feb]Cow Party【最短路】
  9. Python之Pandas库学习(一):简介
  10. hibernate、struts、spring mvc的作用