Java设计模式—生产者消费者模式(阻塞队列实现)

经典设计模式之 -- 使用阻塞队列实现“生产者-消费者模型” 自己实现了的阻塞队列,介绍了经典的设计模式“生产者-消费者模型”。 阅读详情

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。这篇文章我们来看看什么是生产者消费者模式,这个问题也是多线程面试题中经常被提及的。如何使用阻塞队列(Blocking Queue)解决生产者消费者模式,以及使用生产者消费者模式的好处。

真实世界中的生产者消费者模式

生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者(那个吃的)等待如果桌子空了的话。这里桌子就是一个共享的对象。在Java Executor框架自身实现了生产者消费者模式它们分别负责添加和执行任务。

生产者消费者模式的好处

它的确是一种实用的设计模式,常用于编写多线程或并发代码。下面是它的一些优点:

  1.  它简化的开发,你可以独立地或并发的编写消费者和生产者,它仅仅只需知道共享对象是谁
  2. 生产者不需要知道谁是消费者或者有多少消费者,对消费者来说也是一样
  3.  生产者和消费者可以以不同的速度执行
  4.  分离的消费者和生产者在功能上能写出更简洁、可读、易维护的代码

多线程中的生产者消费者问题

生产者消费者问题是一个流行的面试题,面试官会要求你实现生产者消费者设计模式,以至于能让生产者应等待如果队列或篮子满了的话,消费者等待如果队列或者篮子是空的。这个问题可以用不同的方式来现实,经典的方法是使用wait和notify方法在生产者和消费者线程中合作,在队列满了或者队列是空的条件下阻塞,Java5的阻塞队列(BlockingQueue)数据结构更简单,因为它隐含的提供了这些控制,现在你不需要使用wait和nofity在生产者和消费者之间通信了,阻塞队列的put()方法将阻塞如果队列满了,队列take()方法将阻塞如果队列是空的。在下部分我们可以看到代码例子。

使用阻塞队列实现生产者消费者模式

阻塞队列实现生产者消费者模式超级简单,它提供开箱即用支持阻塞的方法put()和take(),开发者不需要写困惑的wait-nofity代码去实现通信。BlockingQueue 一个接口,Java5提供了不同的现实,如ArrayBlockingQueue和LinkedBlockingQueue,两者都是先进先出(FIFO)顺序。而ArrayLinkedQueue是自然有界的,LinkedBlockingQueue可选的边界。下面这是一个完整的生产者消费者代码例子,对比传统的wait、nofity代码,它更易于理解。

点击(此处)折叠或打开

  1. import java.util.concurrent.BlockingQueue;
  2. import java.util.concurrent.LinkedBlockingQueue;
  3. import java.util.logging.Level;
  4. import java.util.logging.Logger;
  5.  
  6. public class ProducerConsumerPattern {
  7.  
  8.     public static void main(String args[]){
  9.  
  10.      //Creating shared object
  11.      BlockingQueue sharedQueue = new LinkedBlockingQueue();
  12.  
  13.      //Creating Producer and Consumer Thread
  14.      Thread prodThread = new Thread(new Producer(sharedQueue));
  15.      Thread consThread = new Thread(new Consumer(sharedQueue));
  16.  
  17.      //Starting producer and Consumer thread
  18.      prodThread.start();
  19.      consThread.start();
  20.     }
  21.  
  22. }
  23.  
  24. //Producer Class in java
  25. class Producer implements Runnable {
  26.  
  27.     private final BlockingQueue sharedQueue;
  28.  
  29.     public Producer(BlockingQueue sharedQueue) {
  30.         this.sharedQueue = sharedQueue;
  31.     }
  32.  
  33.     @Override
  34.     public void run() {
  35.         for(int i=0; i<10; i++){
  36.             try {
  37.                 System.out.println("Produced: " + i);
  38.                 sharedQueue.put(i);
  39.             } catch (InterruptedException ex) {
  40.                 Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);
  41.             }
  42.         }
  43.     }
  44.  
  45. }
  46.  
  47. //Consumer Class in Java
  48. class Consumer implements Runnable{
  49.  
  50.     private final BlockingQueue sharedQueue;
  51.  
  52.     public Consumer (BlockingQueue sharedQueue) {
  53.         this.sharedQueue = sharedQueue;
  54.     }
  55.  
  56.     @Override
  57.     public void run() {
  58.         while(true){
  59.             try {
  60.                 System.out.println("Consumed: "+ sharedQueue.take());
  61.             } catch (InterruptedException ex) {
  62.                 Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
  63.             }
  64.         }
  65.     }
  66.  
  67. }
  68.  
  69. Output:
  70. Produced: 0
  71. Produced: 1
  72. Consumed: 0
  73. Produced: 2
  74. Consumed: 1
  75. Produced: 3
  76. Consumed: 2
  77. Produced: 4
  78. Consumed: 3
  79. Produced: 5
  80. Consumed: 4
  81. Produced: 6
  82. Consumed: 5
  83. Produced: 7
  84. Consumed: 6
  85. Produced: 8
  86. Consumed: 7
  87. Produced: 9
  88. Consumed: 8
  89. Consumed: 9
07RK3568 I2S主模式 FPGA RK3568与fpga通过i2s0连接,fpga连接音频芯片ES8388,RK为i2s主模式。调试时发现可正常采集来自fpga的数据。不可发送数据至fpga。由于i2s后连接fpga这里用了Rockchip的dummy-codec,一个虚拟的编解码器。 阅读详情

相关推荐

5G NR LDPC码(2)—— 从基图到速率匹配:解码5G高速数据信道的标准化设计

本文深入解析了5G NR LDPC码的标准化设计流程。从作为核心骨架的基图(BG1/BG2)出发,详细阐述了其如何通过扩展因子Z灵活生成实际校验矩阵,并协同传输块大小计算与分段策略。文章重点剖析了基于循环缓存和冗余版本的速率匹配机制,以及其如何高效支撑增量冗余混合自动重传请求,从而确保5G高速数据信道在复杂环境下的可靠与高效传输。

weixin_29206669的博客 273

生产者消费者模式的几种实现方式以及线程安全问题

生产者消费者模式的几种实现方式拿我们生活中的例子来说,工厂生产出来的产品总是要输出到外面使用的,这就是生产与消费的概念。 在我们实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。 产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。 第一种:采用wait—notify实现生产者消费者

noaman_wgs的博客 1万+

halcon C++编程 第4讲 HObject/HImage Mat相互转换(tcy)

网上有很多相互转换程序,但并不知那个正确,本文对相互转换后的结果和原对象比较是否相同判断转换是否正确。经测试ok.本文包括转换代码及测试是否相同。 1.转换程序: /************************************ HObject转为Mat:time:2021/3/16 V1.0 *************************************/ cv::Mat HalconClass::HObjectToMat(const HalconCpp::HObject&..

tcy-阿春 4936

阻塞队列——生产者消费者模型

目录🍉 阻塞队列🍉阻塞队列的功能🍉生产者消费者模型🍉生产者消费者模型的优点 🍉 阻塞队列 在学习数据结构时 我们了解到了什么是队列,普通队列遵守先进先出的规则,阻塞队列同样也符合这样的规则,但是相比于普通队列阻塞队列还有着其他的功能 🍉阻塞队列的功能 线程安全:阻塞队列是我们多线程中的案列之一,既然属于多线程,那么一定和线程安全有关系,阻塞队列主要的功能就是能保证线程安全 产生阻塞效果 1.若队列为空,尝试出队列,就会出现阻塞,阻塞到队列不为空为止 2 .若队列为满,尝试如队列也会出现堵塞,阻塞到队列

weixin_48796138的博客 2759

使用ShaderGraph制作URP各向异性

URP上用shaderGraph实现各向异性效果,解决只能用shader的问题

dreamform的专栏 1099

pycharm添加Anaconda解释器显示不出来

因为我之前下载的是pycharm最新版本2024.1的,所以我抱着试一试的心态卸载重装了2021.3.3的,创建新文件的时候立刻就自己识别好了conda环境。就是图中画圈的地方,之前一直显示为python的图标,但是再Python Interpreter后面跟的路径确实是我下载anaconda的地方。另外一种方法就是使用Virtualenv Environment方式配置,但是我的pycharm还是没有识别出conda的图标。首先是这位的方法,先添加系统解释器,再重启,但是我的图标还是python。

2202_75803271的博客 4006

【Java多线程案例】使用阻塞队列实现生产者消费者模型

本期讲解:阻塞队列之生产者消费者模型,模拟实现生产者消费者模型。

我的主页 3270

Linux中断子系统(二)—— 通用框架处理

1、数据结构分析 (1)中断描述符结构structirq_desc: 1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix- tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中; 2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的 形式组织,并且已经分配好; 3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符; (2)stru...

weixin_38428439的博客 4873

使用阻塞队列实现生产者消费者模式

在做大批量数据的导入操作时,为了提升性能,我们是否可以使用阻塞队列实现异步读取数据和处理数据呢?显然是可以这样操作的,我们可以使用主线程读取Excel数据,将数据放入阻塞队列中,同时新建一个子线程,对读取的Excel数据进行系列的逻辑处理,这样等于本来是一个人做的事,我们改成了两个人同时进行。再进一步思考,既然是异步生产和消费数据,我们是否可以使用多线程呢,把拆分成两个人改成拆分成10个人,5个人生产数据,5个人读取数据,这样是不是性能再次提升呢?接下来,我就使用阻塞队列来实现生产者和消费者模式。.....

天天发梦的梦想哥 1538

YOLO26 vs YOLOv12 vs YOLOv10:工业场景性能实测,速度/精度/部署难度全对比(附完整测试代码)

YOLO26:工业场景全能型选手,无NMS+无DFL设计让部署和推理都省心,小目标精度优势明显,CPU推理速度提升43%,适合大多数生产线场景YOLOv12:中大型目标检测专家,Area Attention在复杂背景下表现出色,适合汽车、家电等大型零部件检测YOLOv10:速度狂魔,GPU上性能领先,轻量化版本适合边缘部署,但小目标精度略逊,适合对实时性要求极高的分拣线场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 625

Gemini-CLI 登录失败?解决报错 This account requires setting the GOOGLE_CLOUD_PROJECT env var 的问题

🚀 刚装好 `gemini-cli` 就遇到登录拦路虎?别慌!本文带你深入解析 `GOOGLE_CLOUD_PROJECT` 环境变量错误的根源,并提供超详细的图文解决方案,让你丝滑开启 AI 命令行之旅!快来抄作业!✍️

XiaoqiangClub的博客 5143

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

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。这篇文章我们来看看什么是生产者消费者模式,这个问题也是多线程面试题中经常被提及的。如何使用阻塞队列(Blocking Queue)解决生产者消费者模式,以及使用生产者消费者模式的好处。真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见...

weixin_42113552的博客 223

【数据同化第二期】数据同化中三大理论基础之一(最小方差估计)

【数据同化第二期】深入理解数据同化及经典案例(最小方差估计)

WW、forever的博客 1597

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

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。这篇文章我们来看看什么是生产者消费者模式,这个问题也是多线程面试题中经常被提及的。如何使用阻塞队列(Blocking Queue)解决生产者消费者模式,以及使用生产者消费者模式的好处。真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见...

weixin_31943957的博客 266

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java阻塞队列设计思想_Java设计模式—生产者消费者模式(阻塞队列实现)

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。这篇文章我们来看看什么是生产者消费者模式,这个问题也是多线程面试题中经常被提及的。如何使用阻塞队列(Blocking Queue)解决生产者消费者模式,以及使用生产者消费者模式的好处。真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见...

weixin_39542340的博客 94

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

生产者消费者模式是并发、多线程编程中经典的真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者(那个吃的)等待如果桌子空了的话。这里桌子就是一个共享的对象。在Java Executor框架自身实现了生产...

weixin_33212915的博客 279

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

生产者-消费者模式

生产者-消费者模式是一个经典的并发设计模式,它为多线程之间的协作提供了良好的解决方案... ...

XiuXiuBlaza 777

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

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

weixin_42146366的博客 6938

基于队列的生产消费设计java_java阻塞队列实现生产者消费者模式

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。这篇文章我们来看看什么是生产者消费者模式,这个问题也是多线程面试题中经常被提及的。如何使用阻塞队列(Blocking Queue)解决生产者消费者模式,以及使用生产者消费者模式的好处。真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见...

weixin_30260057的博客 259

多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)

这样小菜鸡们可以根据这些方案(ACM里面叫板子, 象棋五子棋里叫棋谱, 咱这里叫 设计模式), 略加修改, 这样代码再差也差不到哪里去 …单例模式就是巧用 Java 的语法规则, 达成了某个类只能被创建出一个实例 (单线程多线程下都只能创建出一个实例)饿汉模式就是直接创建对象, 需要用的时候可以直接用, 不用再等待实例的创建等过程。在有些场景中, 有些特定的类, 只允许创建出一个实例, 不应该创建出多个实例。懒汉模式就是不直接创建对象(实例), 什么时候用到, 才创建对象(实例)让一个任务在指定时间运行。

shianla的博客 1179

想进大厂?单例模式和阻塞队列你了解吗?

单例模式 概念 单例模式是校招中最长考的设计模式之一,所以我们先介绍什么是设计模式。 设计模式:软件开发中有许多常见的“问题场景”,比如各种各样的工厂它们的运营模式都是类似,针对这些问题场景,大佬们总结出了一些固定的套路,并且用代码实现了基本模板。 单例模式:能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例。例如JDBC中的DataSource。 单例模式的具体实现方式,分为"饿汉"和"懒汉"两种 饿汉模式 何为饿汉模式? 顾名思义饥不择食,慌不择路,这里也是同

weixin_52206295的博客 1091

生产者消费者模型

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。 真实世界中的生产者消费者模式 生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者(那个吃的)等待如果桌子空了的话。这里桌子就是一个共享的对象。 直接使用Java的BlockingQueu

jiangkun0331的博客 236
上一篇: SVN的标准目录结构:trunk、branches、tags
下一篇: crontab 定时任务
zljjava
博客等级 码龄15年 155粉丝 15原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值