【JavaEE】——阻塞队列,生产消费者模型(较难)
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你!
目录
一:阻塞队列
1:概念
2:阻塞队列与普通队列比较
二:“生产者消费者模型”——包饺子
1:包饺子流程
2:分工协作
(1)解释
(2)问题
三:“生产者消费者模型”——分布式系统
1:分布式模型
2:队列阻塞优化
3:缺点
4:优点
①解耦合
②缓冲压力(削峰填谷)
四:自己实现一个阻塞队列
前引:库中自带阻塞队列的数据结构
编辑
1:自己实现的一个队列
2:线程安全问题
(1)问题一
(2)阻塞队列部分怎么写
①用wait
②唤醒问题
③解决方法:
一:阻塞队列
1:概念
对于一个满的队列,入队操作就会陷入阻塞,直到这个队列有元素出队后,才可以往队列里面加入元素。
对于一个空的队列,出队操作就会陷入阻塞,直到这个队列有元素入队后,才可以对队列进行出队操作
2:阻塞队列与普通队列比较
阻塞队列在多线程中是比价安全的
二:“生产者消费者模型”——包饺子
1:包饺子流程
①和面(一般一个人即可,不适用于多线程)
②撵饺子皮
③包饺子
上述②③可以多线程进行
假设现在有三个滑稽老铁包饺子
假设,每个滑稽老铁拿到擀面杖,擀了一个皮,包了一个饺子,在这个过程中,滑稽老铁会争夺擀面杖(锁竞争),虽然比单线程快,但是效率还是很低
2:分工协作
(1)解释
上述图,一号老铁负责专门撵饺子皮(生产),2,3号负责包饺子,桌子(阻塞队列)负责传递饺子皮,大大提高了包饺子的效率。
(2)问题
①1号滑稽撵饺子皮的速度远远大于包饺子的速度,导致桌子上全是饺子皮,此时桌子就相当于队列阻塞
②1号滑稽撵饺子皮的速度远远小于包饺子的速度,导致桌子上是空的,2号3号空闲,此时桌子就相当于队列空
三:“生产者消费者模型”——分布式系统
1:分布式模型
通过上面的简述我们来看实际开发中是怎样的模型
实际开发过程中,服务器的整个功能往往是由多个服务器分工,它们彼此间通过网络通信进行交互。
2:队列阻塞优化
但在上述图中,A与B,A与C之间的耦合性比较强,有一个挂了,很可能就会影响到其它的服务器,于是我们引入队列阻塞
A和BCD之间不是直接交互了,而是通过队列这个中间桥梁进行交互,如果B挂了,也不会影响到ACD
3:缺点
①系统更复杂了,要维护的服务器变多
②效率降低,有阻塞队列这个中间商,必然会增加开销了
4:优点
①解耦合
②缓冲压力(削峰填谷)
四:自己实现一个阻塞队列
前引:库中自带阻塞队列的数据结构
在Java标准库中提供了三种现成的带有阻塞队列的数据结构
其中它们的入队列有两种方法put(自带阻塞效果)offer(不带有阻塞效果)
下面我们举例一种
ArrayBlockingQueue queue2 = new ArrayBlockingQueue<>(100);try {queue2.put("put方法不带阻塞功能");} catch (InterruptedException e) {throw new RuntimeException(e);}queue2.offer("offer方法带有阻塞功能");try {System.out.println(queue2.take());System.out.println(queue2.take());} catch (InterruptedException e) {throw new RuntimeException(e);}
1:自己实现的一个队列
package thread;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-09-25* Time: 17:47*/
class MyQueue{String[] elems = null;int head = 0;//记录出元素时int tail = 0;//记录进元素时int size = 0;//当前队列中有多少个元素public MyQueue(int capacity){elems = new String[capacity];}public void put(String elem){if (size >= elems.length ){//此时队列满了放不了要在这写阻塞return;}elems[tail] = elem;tail++;if(tail >= elems.length){tail = 0;}size++;}public String take(){if(size <= 0){return null;}String elem = elems[head];head++;if (head >= elems.length){head = 0;}size--;return elem;}}
public class ThreadDemon31 {public static void main(String[] args) {MyQueue queue = new MyQueue(100);queue.put("aaa");queue.put("bbb");queue.put("ccc");queue.put("ddd");System.out.println("开始出队列");System.out.println(queue.take());System.out.println(queue.take());System.out.println(queue.take());System.out.println(queue.take());}
}
2:线程安全问题
(1)问题一
①打包成这样可以吗——不行,size最后会被写两遍
②解决方式:给整个put方法内部都加上synchronized
(2)阻塞队列部分怎么写
①用wait
②唤醒问题
可以看到上述图例:假设现在队列满,两个put都阻塞,take出了 一个元素,唤醒了第一个put,第一个put又唤醒了第二个put,这就出问题了
③解决方法:
详细看明白上面举的例子后继续~~
我们知道对于,wait(等待)和notify(唤醒)中间隔着的几秒,对于计算机来说,可能就会发生翻天覆地的变化。这个if条件句就是,被唤醒后,其实现状不一定像一开始满足这个if条件句了
于是我们引入替换成——while语句,句内的wait被唤醒后会再一次进行条件判断,如果此时条件,不满足,会再一次的陷入wait等待。
在java编译器中,也是推荐wait和while循环配套使用。
相关文章:

【JavaEE】——阻塞队列,生产消费者模型(较难)
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 一:阻塞队列 1:概念 2:阻塞队列与普通队列比较 二:“生…...

makefile和CMakeLists/C++包管理器
make 大家可能会很奇怪,都什么年代了,还学makefile,cmake都有些过时了,为什么还要再学这个呢? 我是这么看待这个问题的,cmake跨平台性还是很有有优势的,有着多年积累的底蕴,借助大模…...

STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器
目录 一、AT24CXXX 系列存储器介绍1、基本信息2、寻址方式3、页地址与页内单元地址4、I2C 地址5、AT24CXX 的数据读写5.1 写操作5.1.1 按字节写5.1.2 按页写 5.2 读操作5.2.1 当前地址读取5.2.2 随机地址读取5.2.3 顺序读取 二、代码实现1、ctl_i2c2、at24c3、测试程序 I2C 相关…...

Go语言匿名字段使用与注意事项
1. 定义 Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段,称之为匿名字段或者嵌套字段。 所谓匿名字段实际上是一种结构体嵌套的方式,所以也可以称作嵌套字段。 这种方式可以实现组合复用,即通过匿名字段,结构体…...
2024最新!!Java后端面试题(2)看这一篇就够了
hello uu们 感谢收看!!!!我最近听了一首歌《21》,真的很感慨,马上步入20的我也感觉时间真的飞快...望大家都能过上理想的生活,不负内心的所托...现在口语化更新答案,让大家更加模拟的…...

超好用的10款视频剪辑软件,从入门到精通
视频剪辑软件哪款比较好呢?无论是专业制作团队、自媒体创作者,还是家庭用户,一款好用的视频剪辑软件都能极大地提升创作效率和作品质量。以下是十款备受推崇的视频剪辑软件,分别从适用人群、易用程度和功能特点进行介绍。 1.影忆…...
python股票因子,交易所服务器宕机,量化交易程序怎么应对
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...

瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法
本文适用于触觉智能所有支持Android11系统的开发板修改第三方输入法为默认输入法。本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款鸿蒙开发主板。 一、安装输入法并查看输入…...
使用nest+typeorm框架写数据库导致mysql的binlog暴增记录
这 两天用nesttypeorm写了一个商城,上线后mysql日志binlog两天就达到了10几个G,排查结果如下: 有个功能是定时遍历所有未签收的订单,看看是否到了自动签收时间,如果到了,就把订单状态设置成已签收。 代码…...

组合逻辑元件与时序逻辑元件
组合逻辑元件和时序逻辑元件都是数字电路中的基本构建块,但它们在功能和结构上存在显著差异。 1. 组合逻辑元件: 内容: 组合逻辑元件的输出仅取决于当前的输入,而与之前的输入无关。 它们没有记忆功能。 常见的组合逻辑元件包括: 与门 (AND…...

天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端
今天给大家带来一款单机游戏的架设:天龙八部怀旧单机微改人面桃花。 另外:本人承接各种游戏架设(单机联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的…...
docker管理
拉取容器镜像 docker pull 镜像名:镜像版本查看镜像 docker images查看容器列表 # 查看正在运行的容器 docker ps # 查看全部的容器(包括停止的容器) docker ps -a进入容器 docker exec -it 容器id /bin/bash停止容器 docker stop 容器id运行容器 docker start 容器id删除…...

electron教程(三)窗口设置
在main.js文件中,创建窗口时会设置窗口的大小,其实还有很多其他属性,可以根据实际需求选择设置,但部分属性存在局限性,官网也有明确告知:自定义窗口 | Electron (electronjs.org) 项目文件目录如下&#x…...

图像增强论文精读笔记-Deep Retinex Decomposition for Low-Light Enhancement(Retinex-Net)
1. 论文基本信息 论文标题:Deep Retinex Decomposition for Low-Light Enhancement 作者:Chen Wei等 发表时间和期刊:2018;BMVC 论文链接:https://arxiv.org/abs/1808.04560 2. 研究背景和动机 低光照条件下拍摄的…...

2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU
1.配置时间2024/9/25 2.Anaconda-python版本3.7,yolox版本0.2.0 YOLOX网址: https://github.com/Megvii-BaseDetection/YOLOX 本人下载的这个版本 1.创建虚拟环境 conda create -n yolox37 python37 激活 conda activate yolox37 2.安装Pytorch cuda等&…...

vue-i18n在使用$t时提示类型错误
1. 问题描述 Vue3项目中,使用vue-i18n,在模版中使用$t时,页面可以正常渲染,但是类型报错。 相关依赖版本如下: "dependencies": {"vue": "^3.4.29","vue-i18n": "^9.1…...
大厂面试真题-什么是CAS单点登录?什么原理
CAS(Central Authentication Service,中央认证服务)单点登录(SSO,Single Sign-On)的原理主要基于统一的认证机制和票据验证过程,使得用户只需在多个相互信任的应用系统中登录一次,即…...

用Java提取PDF表格到文本、CSV、Excel工作表
如何精准地提取PDF格式中嵌入的表格数据,并将其无缝转换为更加易于分析和操作的形式,如纯文本、CSV文件或Excel工作表,是一项重要的文档处理技巧。使用Java,我们可以简单地实现这一过程。本文将介绍如何利用Java从PDF文档提取表格…...
OpenCV视频I/O(10)视频采集类VideoCapture之从视频流中检索一帧图像函数 retrieve()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 解码并返回已抓取的视频帧。 cv::VideoCapture::retrieve() 是 VideoCapture 类的一个成员函数,用于从视频流中检索一帧图像。 retr…...

【RocketMQ】SpringBoot整合RocketMQ
🎯 导读:本文档详细介绍了如何在Spring Boot应用中集成Apache RocketMQ,并实现消息生产和消费功能。首先通过创建消息生产者项目,配置POM文件引入RocketMQ依赖,实现同步消息发送,并展示了如何发送普通字符串…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...

工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...