阻塞队列学习

1、什么是阻塞队列?

顾名思义,就是支持阻塞的队列,相比于其他的队列,阻塞队列支持以下特性:

  • 队列为空的时候,获取元素的线程会等待队列变为非空。
  • 队列为满的时候,存储元素的线程会等待队列可以放入元素。
2、阻塞队列的用处?

通常用于生产者-消费者模型,可以起到解耦,削峰填谷的作用

3、java中的阻塞队列

JDK7提供了7个阻塞队列。分别是

  • ArrayBlockingQueue : 一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue : 一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue : 一个支持优先级排序的无界阻塞队列。
  • DelayQueue: 一个使用优先级队列实现的无界阻塞队列。
  • SynchronousQueue: 一个不存储元素的阻塞队列。
  • LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列。
4、介绍一些阻塞队列中常用的方法
  1. 添加元素的方法
    1. offer(E e):添加元素,不涉及阻塞
    2. offer(E e, long timeout, TimeUnit unit):带时间参数的offer,如果队列满了,会阻塞指定时间进行尝试添加,超时才会返回false
    3. put(E e) : 如果没办法添加到队列中,就会一直阻塞下去
  2. 取出元素的方法(取出并移除):
    1. poll() :取出元素,取不到就返回null
    2. poll(long timeout, TimeUnit unit) :取出元素,取不到就等待,指定时间后还取不到才会退出
    3. take():如果取不到元素,就一直阻塞下去

5、 源码,这里只介绍ArrayBlockingQueue,其他的也大同小异
5.1、基本属性和构造器
// 底层实现,数组
final Object[] items;
// 队列头部的索引坐标,因为是FIFO,用于take poll peek get等方法
int takeIndex;

// 队列尾部的索引坐标,用于offer,put add等方法
int putIndex;

// 记录队列中元素的个数
int count;

// 锁,默认非公平锁
final ReentrantLock lock;

// 定义两个条件对象,分别表示队列不为空,或者队列不为满
private final Condition notEmpty;
private final Condition notFull;

// 构造方法,默认使用费公平锁,也可以传入参数,选择公平锁
public ArrayBlockingQueue(int capacity) {
    this(capacity, false);
}

public ArrayBlockingQueue(int capacity, boolean fair) {
    if (capacity <= 0)
        throw new IllegalArgumentException();
    this.items = new Object[capacity];
    lock = new ReentrantLock(fair);
    notEmpty = lock.newCondition();
    notFull =  lock.newCondition();
}
5.2 、添加元素方法
5.2.1 、add 方法其实最终调用的也是offer方法,就是添加元素,不涉及阻塞

5.2.2、 不带时间参数的offer

看上述代码,先加锁,如果数组元素满了,添加失败,返回false,否则添加成功,返回true。

5.2.3、带时间参数的offer

看代码,如如果队列满了,就await指定时间,指定时间内没有成功添加的话,返回false

5.2.4 put 方法

看代码,如果队列是满的添加不进去,该方法会一直阻塞

5.3 、取出元素方法
5.3.1 不带时间参数的poll

如果为空,就返回null,不为空就取出队列头部元素

5.3.2 带时间参数的poll

如果为空,等待指定时间,指定时间后还取不到元素,就返回null 

5.3.3 take方法

如果取不到元素,就一直阻塞下去。

5.4、enqueue 和 dequeue

enqueue,将元素添加到数组中的具体方法

  1. 将元素插入数组的指定坐标
  2. 如果当前坐标已经是数组元素的最后一位了,那么下一位坐标要从0开始,类似一个环形数组
  3. 当前元素树加1
  4. 激活因为队列为空而阻塞的线程。

dequeue, 将元素从数组中取出的具体方法

  1. 获取队头的元素,然后指定坐标位置元素置为null
  2. 如果当前坐标已经是数组元素的最后一位了,那么下一位坐标要从0开始,类似一个环形数组
  3. 当前元素数量减一
  4. 激活因为队列满了而阻塞的线程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

认证授权与JWT

认证授权与JWT 1、认证授权概念介绍1.1 什么是认证1.2 什么是授权 2、权限数据模型3、RBAC权限模型3.1 介绍3.2 基于角色访问控制3.3 基于资源访问控制 4、常见认证方式4.1 Cookie-Session4.2 jwt令牌无状态认证 5 常见技术实现6.Jwt介绍6.1 JWT简介6.2.Jwt组成 7、JWT使用7.1 …

JFMQL100TAI900/JFMQL100T900全国产化 ARM 核心板+扩展板/全国产开发板

TEC100TAI-KIT 是一款基于青龙100TAI 的全国产智能异构计算平台开发套件&#xff0c;该套件包含 1个 100TAI 核心板和 1 个 PCIE 规格的扩展底板。该 套 件 的 核 心 板 集 成 了 100TAI 的 最 小 系 统 &#xff0c; 包 含 一 颗JFMQL100TAI900 片上系统芯片&#xff0c;该单颗…

5、Async await(等待异步)、函数的防抖和节流、模块化

一、Async await(等待异步) Async去声明函数&#xff0c;返回一个promise对象&#xff0c;await在声明的函数里面使用 function fn_1() {return fn_1 } function fn_2() {return new Promise((reslove) > {setTimeout(() > {//因为定时器是异步的 num 10return reslov…

使用gnvm下载nodejs和npm

目录 前言 一、下载gnvm 二、利用gnvm下载nodejs 三、下载对应版本的npm 四、gnvm常用的命令 总结 前言 由于之前下载的版本过低&#xff0c;需要升级版本。但在使用gnvm升级node版本时遇到了一系列的问题&#xff0c;索性就把nodejs全部删除&#xff0c;重新用gnvm在下…

【保姆级教程】JDK安装与环境变量配置

文章目录 第一步&#xff1a;下载JDK&#xff08;以1.8为例&#xff09;第二步&#xff1a;安装第三步&#xff1a;找到默认安装目录第四步&#xff1a;配置环境变量&#xff08;win10为例&#xff09; 大家可能会遇到的疑问&#xff1a;一个电脑可以安装多个版本的jdk没有问题…

抽样算法——【数据科学与工程算法基础】

一、前言 这是课程的第二章节——抽样算法&#xff0c;主要分为三类。 详情可参考&#xff1a; 数据科学的算法基础——学习记录跳转中心 二、正篇 1.系统抽样 课本只介绍了最简单的——等距抽样。 直线等距抽样&#xff08;Nn*k&#xff09;&#xff1a;即总体个数可以被抽…

swiftUI 中如何忽略safeArea

swiftUI 中如何忽略safeArea 不管是UIKit和swiftUI为了能适配更多设备&#xff0c;所以出来了一个safeArea的设定。那如何把我们的控件放到safeArea里面呢 答案就是ignoresSafeArea ignoresSafeArea 通过把Text空间放到一个VStack下然后给VStack设置宽高无限大&#xff0c;就…

如何选择合适的IP代理,如何为网络爬虫设置代理

目录 前言 1. 代理类型的选择 2. 代理速度 3. 代理稳定性 4. 代理的匿名性 5. 代理的地理位置 总结 前言 在进行网络爬虫任务时&#xff0c;为了避免被目标网站封禁IP或限制访问频率&#xff0c;我们通常会使用代理来隐藏真实的IP地址。选择合适的IP代理对于爬虫的成功…

1. DDPM模型概述

1. DDPM模型概述 扩散模型&#xff08;DM&#xff0c;Diffusion Model&#xff09;是一类生成模型&#xff0c;常见的生成模型还有GAN和VAE。扩散模型分为前向阶段和逆向阶段&#xff0c;在前向阶段中逐步向数据中添加噪声&#xff0c;直至数据变成完全的高斯噪声&#xff0c;…

Redis高可用之哨兵模式和集群模式

Redis高可用 Redis哨兵高可用 概述 sentinel哨兵是特殊的redis服务&#xff0c;不提供读写服务&#xff0c;主要用来监控redis实例节点。 哨兵架构下client端第一次从哨兵找出redis的主节点&#xff0c;后续就直接访问redis的主节点 不会每次都通过sentinel代理访问redis的主…

网络地址转换协议NAT

网络地址转换协议NAT NAT的定义 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址&#xff08;即仅在本专用网内使用的专用地址&#xff09;&#xff0c;但现在又想和因…

YOLOv8改进 | 注意力机制 | 添加YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM,SEAM(Spatially Enhanced Attention Module)注意力网络模块旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来实现这一目标,其希望通过学习遮挡面和未遮挡面之间的…

Word转PDF保持图片原有清晰度

目录 1、需要的软件 2、配置Acrobat PDFMaker 3、配置Acrobat Distiller 4、更改Acrobat PDFMaker中的首选项 5、将word转换成pdf 1、需要的软件 利用Adobe Acrobat DC工具。 打开word&#xff0c;选择Acrobat的插件&#xff0c;选择首选项。 如果没有出现Acrobat插件也…

Java学习记录(十七)IO流(三)

转换流&#xff08;在字节流中想使用字符流的方法时使用&#xff09; 转换流是字节流和字符流之间的桥梁&#xff0c;转换流本身其实就是字符流所以可以使用字符流里的相关方法&#xff0c;通过InputStreamReader字符转换输入流能将字节流转化为字符流输入到内存中&#xff0c…

基于java的公寓报修管理系统设计与实现(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

portraiture2024汉化版PS人像处理的磨皮美化插件

Portraiture插件是一款广泛应用于人像处理的磨皮美化插件&#xff0c;尤其在Photoshop和Lightroom等图像编辑软件中备受欢迎。这款插件能够帮助用户快速实现智能磨皮效果&#xff0c;使皮肤看起来更加平滑细腻&#xff0c;同时保留自然纹理和其他重要细节。Portraiture是一款适…

STM32利用标准库编写同时输出4路PWM信号的程序(Proteus)仿真

先看看结果&#xff1a; 这个是根据上午发的文章的基础上更改的&#xff0c;很简单&#xff0c;只是用了一个定时器&#xff0c;初始化了4个比较器而已&#xff0c;就可以单独的控制每一路PWM的占空比了&#xff0c;好了&#xff0c;把源文件展示一下&#xff0c;完事去接孩子放…

NCDA大赛中哪些HTML5设计作品展现出色?

与传统的HTML网页设计相比&#xff0c;HTML5网页设计主要是对网页内容的加强。HTML5已成为目前最流行的标记语言&#xff0c;拥有成熟的社区和广泛的浏览器支持&#xff0c;HTML5完整的功能和强大的扩展性使设计师和开发者能够点铁成金。HTML5可以一手控制更多可控元素&#xf…

eggjs+egg-mongoose操作mongodb数据库

使用的数据库是mongodb数据库&#xff0c;mongodb的数据库表创建就不一一介绍了&#xff0c;可自行查询资料如何创建数据库。 使用的数据库可视化工具是mongodb compass 使用的接口工具是postman 这里使用的egg项目脚手架模板是simple版本&#xff0c;详细创建项目流程可在egg…

Redis常见数据类型下

目录 Hash 哈希 常用指令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET 内部编码 Hash类型和关系型数据库 缓存方式对比 List 列表 特点 常用命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP / RPOP LINDEX LINSERT 阻塞(BLOCK)版…
最新文章