[JAVAEE] 多线程的案例(二) - 阻塞队列 生产者消费者模型

目录

一. 什么是阻塞队列

二. java中的阻塞队列

三. 生产者消费者模型

3.1 生产者消费者模型与阻塞队列密不可分的关系

3.2 阻塞队列在生产者消费者模型的作用

a. 解耦合

b. 削峰填谷

四. 模拟实现阻塞队列

 4.1 实现put方法

4.2 实现take方法

4.3 生产者消费者模型​

五.总结


一. 什么是阻塞队列

阻塞队列是具有阻塞特性的队列, 它是线程安全的.

阻塞特性:

1. 出队列时, 如果队列为空, 此时就会阻塞, 直到向队列中添加元素为止.

2. 入队列时, 如果队列满了, 此时也会阻塞, 直到从队列中移出元素为止.


二. java中的阻塞队列

java中的阻塞队列是一个接口(BlockingQueue<T>), 常用的实例化类有:

1. ArrayBlockingQueue<>(capacity); // 顺序表

2. LinkedBlockingQueue<>(capacity); // 链表

3. PriorityBlockingQueue<>(capacity); // 优先级队列

带有阻塞效果的放取: put(), take().


三. 生产者消费者模型

3.1 生产者消费者模型与阻塞队列密不可分的关系

阻塞对列是生产者消费者模型的交易场所.

3.2 阻塞队列在生产者消费者模型的作用

a. 解耦合

解耦合之前, 服务器A直接和服务器B进行交互, 一旦服务器A中的代码发生了改变, 服务器B也需要做出相应的改变.(AB之间关系紧密)

解耦合之后, 服务器A不再与服务器B直接关联, 而是通过阻塞队列来进行交互, 降低了AB之间的关联度.

b. 削峰填谷

 如果A传输给B的数据量激增, 而B没有这么大的接收能力, 就会导致服务器断线.

此时, 引入阻塞队列, 激增的数据就会在阻塞队列中进行缓冲, 输入给B的数据量不会超出B的接收能力.


四. 模拟实现阻塞队列

 4.1 实现put方法

重点解读:

synchronized: 保证put操作的原子性.

while: 进行多次判断, 防止notify之后循环队列还是满的, 而导致之后的操作没有意义.

if(tail >= data.length): 表示一次循环已经结束了, 再从头开始.

this.notify(): 此时队列中有元素了, 可以进行take操作.

4.2 实现take方法

重点解读: 

synchronized: 保证take操作的原子性

while: 进行多次判断, 防止notify之后队列还是空的, 导致后面的操作无意义.

4.3 生产者消费者模型        


五.总结

1. 什么是阻塞队列(阻塞队列时带有阻塞效果的队列, 是线程安全的)

2. 阻塞队列的实例化(ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue)

3. 生产者消费者模型与阻塞队列密不可分的关系(阻塞队列是生产者消费者模型的交易场所)

4. 阻塞队列在生产者消费者模型的作用(解耦合, 削峰填谷)

4. 模拟实现阻塞队列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解C# 程序结构

本节我们将学习 C# 编程语言的结构&#xff0c;为了让大家能够对 C# 程序结构有个更好的理解&#xff0c;我们会先演示一个最小的、最简单的 C# 程序结构&#xff0c;以便作为接下来的章节的参考。 C# Hello World 实例 一个 C# 程序主要包括以下部分&#xff1a; 命名空间声明…

08 实战:色彩空间展示(本程序以视频为主)

程序效果如下: 我在这里讲解RGB和YCbCr的原理: 一、RGB颜色空间 1.1 基本概念 RGB颜色空间是一种最基础和常用的颜色表示方式,它基于人眼感知色彩的三原色原理。RGB分别代表: R(Red):红色G(Green):绿色B(Blue):蓝色通过这三种基本颜色的不同组合,可以产生人眼…

Promise、async、await 、异步生成器的错误处理方案

1、Promise.all 的错误处理 Promise.all 方法接受一个 Promise 数组&#xff0c;并返回所有解析 Promise 的结果数组&#xff1a; const promise1 Promise.resolve("one"); const promise2 Promise.resolve("two");Promise.all([promise1, promise2]).…

基于人体姿势博文文章

MATLAB运动目标检测系统应用背景 运动目标的定位跟踪&#xff0c;检测识别&#xff0c;运动分析在图像压缩、运动分析、交通检测&#xff0c;智能监控等方面有主要的应用。 首先&#xff0c;在图像压缩中&#xff0c;运动目标检测技术可以在背景区域中将前景区域提取分割出来…

91.【C语言】数据结构之单向链表的查找,中间插入和删除,销毁

目录 1.链表的查找函数 2.链表的修改函数 3.链表的中间插入函数 1.在pos之前插入:SLTInsertBefore函数 1.借助头指针pphead 示意图 代码示例(写入SList.c) 头文件添加SLTInsertbefore的声明 main.c的部分代码改为 1.测试中间插入 2.测试头部插入 3.测试pos为NULL的…

机器视觉:9点标定的原理与实现

一、什么是标定 标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素&#xff0c;如下图所示&#xff0c;10mm的距离内有222个像素&#xff0c;那像素坐标和实际的毫米坐标就有个比例关系了。 二、九点标定 9点标…

API网关的作用--为什么微服务需要一个API网关?

微服务网关核心作用就是协议转换、安全隔离和流量控制 微服务架构中&#xff0c;API网关作为系统的入口点&#xff0c;可以统一处理所有客户端请求。 1&#xff09;协议转换&#xff1a;它能够支持多种通信协议&#xff08;如HTTP、gRPC等&#xff09;之间的相互转换&#xff…

如何初始化一个线上的GitHub仓库,在本地已有的仓库中上传到线上

如何初始化一个线上的GitHub仓库&#xff0c;在本地已有的仓库中上传到线上&#xff0c; 首先&#xff0c;先创建一个线上的仓库 本地有一个曾经的仓库&#xff0c;或者本地git init创建一个本地仓库 根据线上仓库的主页给的提示代码进行上传 代码如下&#xff1a; …or cr…

gateway 整合 spring security oauth2

微服务分布式认证授权方案 在分布式授权系统中&#xff0c;授权服务要独立成一个模块做统一授权&#xff0c;无论客户端是浏览器&#xff0c;app或者第三方&#xff0c;都会在授权服务中获取权限&#xff0c;并通过网关访问资源 OAuth2的四种授权模式 授权码模式 授权服务器将授…

(三)行为模式:11、模板模式(Template Pattern)(C++示例)

目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将某些步骤…

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码 目录 故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CNN-ResNets&#xff08;卷积神经网络-残差网络&#xff09;在滚动轴承故障诊断中是一种常用的方法。这种方法利用…

Docker 实践与应用举例教程:从入门到精通

Docker 实践与应用举例教程&#xff1a;从入门到精通 引言 在现代软件开发中&#xff0c;Docker 已成为一种不可或缺的工具。它通过容器化技术简化了应用的部署、管理和扩展&#xff0c;极大地提高了开发和运维的效率。本文将详细介绍 Docker 的基本概念、安装步骤、常用命令…

arm ubuntu22.04 安装es7.16.2

1、更新软件包 sudo apt update && sudo apt upgrade -y 2、安装jdk11 sudo apt install openjdk-11-jdk -y 安装查看版本 java -version 输出应该是这样的 openjdk version "11.0.11" 2021-04-20 OpenJDK Runtime Environment (build 11.0.119-Ub…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22目录1. PoisonedRAG: Knowledge corruption attacks to retrieval-augmented generation of large language models摘要创新点…

Java程序设计:spring boot(8)——API ⽂档构建⼯具 - Swagger2

目录 1 环境整合配置 2 Swagger2 常⽤注解说明 2.1 Api 2.2 ApiOperation 2.3 ApiImplicitParams 2.4 ApiResponses 2.5 ApiModel 3 用户模块注解配置 3.1 Controller 使用注解 3.2 JavaBean 使用注解 4 Swagger2 接⼝⽂档访问 由于 Spring Boot 能够快速开发、便捷…

duilib的应用 在双屏异分辨率的显示器上 运行显示不出来

背景&#xff1a;win11&#xff0c;duilib应用&#xff0c;双显示器&#xff0c;两台分辨率相同&#xff0c;分别设置不同的缩放以后&#xff0c;应用运行以后&#xff0c;程序闪一下消失或者程序还在&#xff0c;但是UI显示不出来。 原因 窗口风格设置不合理&#xff0c;所以…

2024.10.9华为留学生笔试题解

第一题无线基站名字相似度 动态规划 考虑用动态规划解决 char1=input().strip() char2=input().strip() n,m=len(char1),len(char2) dp=[[0]*(m+1) for _ in range(n+1)] #dp[i][j]定义为以i-1为结尾的char1 和以 j-1为结尾的char2 的最短编辑距离 setA = set(wirel@com) set…

如何用mmclassification训练多标签多分类数据

这里使用的源码版本是 mmclassification-0.25.0 训练数据标签文件格式如下&#xff0c;每行的空格前面是路径&#xff08;图像文件所在的绝对路径&#xff09;&#xff0c;后面是标签名&#xff0c;因为特殊要求这里我的每张图像都记录了三个标签每个标签用“,”分开&#xff0…

论文笔记(五十)Segmentation-driven 6D Object Pose Estimation

Segmentation-driven 6D Object Pose Estimation 文章概括摘要1. 引言2. 相关工作3. 方法3.1 网络架构3.2 分割流3.3 回归流3.4 推理策略 4. 实验4.1 评估 Occluded-LINEMOD4.1.1 与最先进技术的比较4.1.2 不同融合策略的比较4.1.3 与人体姿态方法的比较 4.2 在YCB-Video上的评…

linux指令笔记

bash命令行讲解 lyt &#xff1a;是用户名 iZbp1i65rwtrfbmjetete2b2Z :这个是主机名 ~ &#xff1a;这个是当前目录 $ &#xff1a;这个是命令行提示符 每个指令都有不同的功能&#xff0c;大部分指令都可以带上选项来实现不同的效果。 一般指令和选项的格式&#xff1a;…