一、生产者—消费者模式介绍
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。

二、为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,所以便有了生产者和消费者模式。

三、生产者消费者模型的实现
生产者是一堆线程,消费者是另一堆线程,内存缓冲区可以使用List数组队列,数据类型只需要定义一个简单的类就好。关键是如何处理多线程之间的协作。在这个模型中,最关键就是内存缓冲区为空的时候消费者必须等待,而内存缓冲区满的时候,生产者必须等待(使用wait()和notifyAll()来实现通知与等待)。其他时候可以是个动态平衡。值得注意的是多线程对临界区资源的操作时候必须保证在读写中只能存在一个线程,所以需要设计锁的策略。

四、Java代码实现生产者—消费者模式
①.Message 类

package chapter2.producerconsumer;/*** @author czd*/
public class Message {private String data;public Message(String data) {this.data = data;}public String getData() {return data;}
}

②.MessageQueue 类

package chapter2.producerconsumer;import java.util.LinkedList;/*** @author czd*/
public class MessageQueue {private LinkedList<Message> queue ;private static int MAX_LIMIT = 100;private int limit;public MessageQueue() {this(MAX_LIMIT);}public MessageQueue(int limit) {this.queue = new LinkedList<>();this.limit = limit;}/*** 将数据存放到队列中* @param message*/public void put(Message message){synchronized (queue){while (queue.size() > limit){try {queue.wait();}catch (Exception e){e.printStackTrace();}}queue.addLast(message);queue.notifyAll();}}/*** 将队列的数据拿出来* @return*/public Message take(){synchronized (queue){while (queue.isEmpty()){try {queue.wait();}catch (Exception e){e.printStackTrace();}}Message message = queue.removeFirst();queue.notifyAll();return message;}}/***获取队列最大的存放数量* @return*/public int getMaxLimit(){return this.limit;}/*** 获取队列当前大小* @return*/public int getQueueSize(){synchronized (queue){return queue.size();}}
}

③.ProducerThread 类

package chapter2.producerconsumer;import java.util.concurrent.atomic.AtomicInteger;/*** @author czd*/
public class ProducerThread extends Thread{private MessageQueue messageQueue;//创建初始值为0的counterprivate static AtomicInteger counter = new AtomicInteger(0);public ProducerThread(MessageQueue messageQueue , int seq) {//为线程起名字super("Producer>>>>>" + seq);this.messageQueue = messageQueue;}@Overridepublic void run() {while (true){try {Message message = new Message("Message>>>>>" + counter.getAndIncrement());messageQueue.put(message);System.out.println(Thread.currentThread().getName() + "   Put MessageData:" + message.getData());Thread.sleep(100);}catch (Exception e){break;}}}
}

④.ConsumerThread 类

package chapter2.producerconsumer;import java.util.concurrent.atomic.AtomicInteger;/*** @author czd*/
public class ConsumerThread extends Thread{private MessageQueue messageQueue;public ConsumerThread(MessageQueue messageQueue , int seq) {//为线程起名字super("Consumer>>>>>" + seq);this.messageQueue = messageQueue;}@Overridepublic void run() {while (true){try {Message message = messageQueue.take();System.out.println(Thread.currentThread().getName() + "   get MessageData:" + message.getData());Thread.sleep(100);}catch (Exception e){break;}}}
}

⑤.ProducerAndConsumerTest 类

package chapter2.producerconsumer;/*** @author czd*/
public class ProducerAndConsumerTest {public static void main(String[] args) {MessageQueue messageQueue = new MessageQueue();new ProducerThread(messageQueue , 1).start();new ConsumerThread(messageQueue , 1).start();new ProducerThread(messageQueue , 2).start();new ConsumerThread(messageQueue , 2).start();}
}

输出结果

高并发编程之生产者—消费者设计模式相关推荐

  1. 高并发编程-线程生产者消费者的综合示例

    文章目录 需求 实现 需求 需求: 假设有10个线程,最多同时运行5个 要求: 不使用线程池,使用synchronized-wait&notifyAll机制 实现 详见注释 package c ...

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

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

  3. 并发编程——进程——生产者消费者模型

    一.生产者消费者模型介绍 为什么要使用生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务. 在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者 ...

  4. 多线程-并发编程(7)-生产者消费者模式及非阻塞队列与阻塞队列实现

    生产者消费者模式是一个十分经典的多线程协作模式 弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻 存在3个元素 1.生产者(类比厨师) 2.生产者的生产产品(类比美食) 3.消费者(类比吃货) ...

  5. 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll

    文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...

  6. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  7. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  8. 基于队列的生产消费设计java_生产者-消费者设计模式

    一.生产者消费者设计模式 1.中间队列 一段内存空间,且可存取: 2.两种角色 (1)生产者:生产数据: (2)消费者:消费数据. 3.三种关系 (1)生产者与生产者的互斥关系: (2)消费者与消费者 ...

  9. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

最新文章

  1. 【linux】Valgrind工具集详解(十四):Cachegrind(缓存和分支预测分析器)
  2. J-Focus动画应用框架使用教程
  3. exe一机一码加密工具_Python代码加密混淆
  4. Cannot open precompiled header file:'Debug/password.pch' No such file or directory
  5. AngularJS 指令之 ng-hide/ng-show
  6. 开源性能测试工具JMeter快速入门(一)
  7. vmware虚拟机Ubuntu安装g++
  8. 机器学习(二)——鸢尾花案例
  9. 2030年,逾1亿中国人需要学习新技能并转换岗位,这就是摩擦性失业
  10. java单链表逆序输出_在数据结构单链表中如何实现倒序输出
  11. leveldb 学习记录(四)Log文件
  12. 多环境切换---SpringBoot
  13. 对vector中的数据排序
  14. 八款你不得不知的开源前端JS框架
  15. 南方cass快捷键命令修改在哪_南方cass快捷键大全_南方cass快捷键命令大全_好特教程...
  16. Web调用海康威视摄像头
  17. matlab雨中行走代码,雨中行走数学建模雨中行走数学建模.doc
  18. 蓝牙认证,蓝牙BQB认证,蓝牙BQB测试内容,蓝牙BQB认证多少钱?蓝牙BQB认证流程
  19. Python基础---输入和输出
  20. Tmw去掉名字服务器显示,7.1WOW大秘境福利:老司机分享溢出与死疽TMW监视

热门文章

  1. Dashy: 一款功能超强大,颜值爆表的可定制专属导航页工具
  2. 已拥有阿里云服务器和域名,怎样搭建网站?
  3. 博客主题用腻了?来试试赛博朋克 2077 主题吧!
  4. 小米8系统推送服务器,小米8推送基于Android 10的MIUI 11开发版
  5. 关于手机rom、ram、internal storage的问题?
  6. 用c语言做99玫瑰花,计算机技术基础(c语言)用C语言描绘玫瑰花.doc
  7. 猫和路由器和交换机有什么区别
  8. 开发者成功在苹果M1Mac设备上运行Switch游戏
  9. SOME/IP协议详解「2.0·服务化通信概述」
  10. C++中有哪些类型转换方式