阻塞队列——Java

一、前言

阻塞队列也是队列的一种,但是带有阻塞性质。但是这种阻塞情况是极端情况,在生产、消费者模型中,当生产者与消费者不协调时,就会出现阻塞情况。

二、特性

线程安全 + 阻塞特性

若队列为空,当尝试出队列时,就会阻塞等待,当其他线程添加元素后就停止阻塞;

若队列为满,当尝试入队列时,就会阻塞等待,当其他线程移除元素后就停止阻塞;

三、常用的阻塞队列

1.ArrayBlockingQueue

ArrayBlockingQueue是基于顺序表实现的队列,在使用时需要传入初始容量,代码如下:

java 复制代码
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(100);

2.LinkedBlockingQueue

LinkedBlockingQueue是基于链表实现的队列,同样也需要传入初始容量,代码如下:

java 复制代码
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(100);

四、常用的方法

由于阻塞队列也属于队列,所以队列中的方法阻塞队列也能用,如下图所示:

但是这些方法都没有阻塞特性,所以在阻塞队列中有两个专门入队列和出队列的方法

1.put

put与offer一样,都是向队列中添加元素,但是put具有阻塞特性;

2.take

take与poll一样,都是出队列操作,但是take具有阻塞特性;

五、阻塞队列的优势

1、解耦合

现有两个服务器A、B,当A与B直接关联时,A、B中就会有部分相同的代码耦合度较高,后续修改代码也会非常不方便,但引入阻塞队列后,A与阻塞队列直接关联,B与阻塞队列直接关联,这样既可以使A与B能进行联系,又能减少两个的重合代码。虽然多出了操作阻塞队列的代码,但这部分代码是大致不变的,这样后续想要修改A或B的代码就相对简单许多。

2、削峰填谷

上游服务器,尤其是入口服务器,干的活更少,单个请求消耗的资源更少;

下游服务器承担了更重的任务量,单个请求消耗的资源更多;

当上游服务器的请求在短时间内快速增加,若两服务器直接关联,就会导致B在短时间内需要请求大量的资源,严重的会导致服务器崩溃;

若引入阻塞队列,使上游服务器与阻塞队列直接关联,下游服务器与阻塞队列直接关联,这样当上游的请求激增时,就会将请求存放在阻塞队列中,使得下游服务器的工作量不会在短时间内增加过多,减缓了下游服务器的压力。

六、代价

1、引入阻塞队列后,整体的结构会更复杂,管理起来更复杂;

2、程序运行的效率会有影响,原本是两对象相互交流,引入阻塞队列后,就是二者分别与阻塞队列交流,使得代码的运行效率会降低。

相关推荐
“AI国潮设计-小江”8 分钟前
【Python实战】SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
k4m7v2pz13 分钟前
从 Python 搬到 Rust:pyglet MIDI DAW 变成 egui 鬼畜采样器的迁移复盘
开发语言·python·rust
C++ 老炮儿的技术栈15 分钟前
MFC CPtrArray的用法
开发语言·数据结构·c++·算法·mfc·c
杨运交18 分钟前
[069][公共模块]Spring Boot 全局异常处理与参数校验实战(下):校验异常精细化处理与 WebFlux 适配
java·spring boot·后端
佳児素花痴╮19 分钟前
C++基础速通
开发语言·c++
是立不是利23 分钟前
深入理解JavaScript事件委托
开发语言·前端·javascript
啊阿狸不会拉杆23 分钟前
《计算机网络-自顶向下方法》6.4 交换局域网 读书笔记
开发语言·计算机网络·php
Raas10037 分钟前
MAI Gateway(魔芋企业级AI网关)对比分析:AI网关和OpenRouter区别?企业级能力差距一览
java·服务器·网络·人工智能·gateway·ai网关·mai gateway
心中有你021438 分钟前
Python Tkinter 情侣恋爱日记桌面小程序(本地文件存储,无数据库)
开发语言·python
APItesterCris1 小时前
告别人工盯品!借助 Open‑Claw 快速搭建电商商品全自动监控与数据分析系统(完整实操代码)
java·大数据·前端·数据库