阻塞队列学习

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.mzph.cn/news/739247.shtml

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

相关文章

Python 单元测试

本篇为Python的单元测试的方法及示例 目录 概念 结果 示例 对函数进行测试 创建函数文件 创建测试文件 测试结果 对类进行测试 创建待测试类 创建测试文件 文档测试 创建函数 进行测试 总结 概念 用来对一个函数、一个类或者一个模块来进行正确性校验工作 结果 …

提取B站视频教程详情

提取B站视频教程详情 背景 B站这个视频列表是真的体验感太差了,有时候想把章节复制下来,再对应的章节下面做笔记,实在是太难搞了,于是就有了这篇文文章 根据关键字获取视频id Test public void list() {String url "https://api.bilibili.com/x/web-interface/wbi/sea…

虚拟机(KVM)克隆

当需要批量部署虚拟机时&#xff0c;可以使用克隆虚拟机的方式来进行。 使用图形界面来克隆虚拟机。 [rootzhoujunru_node1 zhou]# virsh list --allId Name State ------------------------------ vm01 shut off- vm01-clone shut off克隆完成。

Django入门 整体流程跑通

Django学习笔记 一、Django整体流程跑通 1.1安装 pip install django //安装 import django //在python环境中导入django django.get_version() //获取版本号&#xff0c;如果能获取到&#xff0c;说明安装成功Django目录结构 Python310-Scripts\django-admi…

Centos7 安装mongodb 7.0

官方手册参考&#xff1a; https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-red-hat/ Mongodb支持的版本 安装 MongoDB 社区版 按照以下步骤使用包管理器安装 MongoDB Community Edition yum。 配置包管理系统 ( yum) 创建一个/etc/yum.repos.d/mongodb-o…

容量治理三板斧:扩容、限流与降级

前言 随着现代软件系统日益复杂和用户规模的不断增长&#xff0c;分布式架构成为了保持系统高可用性与高性能的标准解决方案。然而&#xff0c;随之而来的是对系统容量治理的新挑战。在这样的背景下&#xff0c;容量治理成为了分布式系统设计和运维中不可或缺的一环。要确保系…

Orange3数据预处理(转换器组件)

该组件接收数据&#xff0c;然后重新应用之前在模板数据上执行的转换。 这些转换包括选择变量的子集以及从数据中出现的其他变量计算新的变量&#xff0c; 例如&#xff0c;离散化、特征构建、主成分分析&#xff08;PCA&#xff09;等。 在Orange3中&#xff0c;描述的这个组件…

初窥机器学习

人工智能 近几年来&#xff0c;人工智能&#xff08;AI&#xff09;已成为家喻户晓的术语&#xff0c;我们在游戏、电影&#xff08;还记得J.A.R.V.I.S吗&#xff1f;&#xff09;和书籍中经常看到它的提及和描绘&#xff0c;但人工智能究竟是什么呢&#xff1f; 人工智能简单…

【Python】新手入门学习:什么是硬编码?如何避免硬编码?

【Python】新手入门学习&#xff1a;什么是硬编码&#xff1f;如何避免硬编码&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教…

初学Vue+Element——Element使用

0 引言 前端的开发模式为MVVM(Model-View-ViewModel)&#xff0c;而Vue侧重于VM开发&#xff0c;主要用于数据绑定到视图的&#xff0c;而ElementUI则侧重于V开发的前端框架&#xff0c;主要用于开发美观的页面的。 1 ElementUI介绍 Element&#xff1a;是饿了么公司前端开发…

项目实战-tpshop商城项目

项目实战-tpshop商城项目 环境部署准备软件工具准备远程连接测试远程连接测试-查看虚拟机IP地址远程连接测试-检测本机与虚拟机是否连通远程连接测试-通过远程工具连接linux服务器 常见问题处理 环境部署项目技术架构介绍部署tpshop项目-tpshop验证数据库验证用户信息表熟悉商品…

智慧公厕的创新:革命性的城市公共卫生设施

在现代城市中&#xff0c;公厕作为城市卫生设施的重要组成部分&#xff0c;对于提升城市形象和保障市民生活品质起着重要作用。然而&#xff0c;传统公厕普遍存在环境脏乱差、设施老旧、管理不规范等问题&#xff0c;给市民的使用体验带来了很多不便和不愉快。针对这一问题&…

魔法之线:探索string类的神秘世界

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

bug--xxoobject has no attribute xxx

Python 创建类的实例后却不能调用写的方法&#xff0c;检查了半天原来是缩进的问题&#xff0c;def函数不应该和class并列 只能说这个英文空格太小了&#xff0c;看不出来。。。。

【线代基础】张量、向量、标量、矩阵的区别

1、标量&#xff08;Scalar&#xff09; 纯数字&#xff0c;无方向性、无维度概念。因此也叫 标量张量、零维张量、0D张量 例如&#xff0c;x18&#xff0c;x21.34 x1、x2即为标量 2、张量&#xff08;tensor&#xff09; 具有方向性&#xff0c;可以理解为一个多维数组&a…

python学习笔记 -- 函数

目录 一. 函数的定义和调用 二. 函数的返回值 三. 变量的作用域 四. 函数的链式调用 五. 函数的嵌套调用 六. 函数的递归调用 七. 函数参数的默认值 八. 关键字传参 一. 函数的定义和调用 函数&#xff0c;指一段可以被重复调用的代码。在python中&#xff0c;函数定义…

Redis系列之持久化机制RDB和AOF

Redis系列之持久化机制RDB和AOF 文章目录 1. 为什么需要持久化&#xff1f;2. 持久化的方式3. RDB机制3.1 RDB机制介绍3.2 配置RDB3.3 什么时候触发3.4 操作实例3.5 RDB优势和不足 4. AOF机制4.1 什么是AOF机制&#xff1f;4.2 同步机制4.3 重写机制4.4 AOF的优势和不足 混合模…

简单使用国产数据库—达梦

达梦数据库是一款由中国的达梦软件公司开发的关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它在业界以其高性能、可扩展性和安全性而著称。该系统广泛应用于各种应用程序的数据存储和管理&#xff0c;满足用户对于数据处理和管理的多样化需求。 安装好的达梦数…

119.龙芯2k1000-pmon(18)-全自动安装linux系统

经过两天的测试和完善&#xff0c;现在基本已经正常可用了。 &#xff08;全自动是假&#xff0c;接近全自动吧。&#xff09; 需要使用配测电脑的网络功能&#xff0c;windows即可&#xff0c;脱离linux虚拟机。&#xff08;理论上讲u盘也是可以的&#xff09; 测试平台&…

客户案例|100M 768 维向量数据,Zilliz Cloud 稳定支持 Shulex VOC 业

日前&#xff0c;国际化 VOC SaaS 公司数里行间&#xff08;Shulex&#xff09;将上亿数据量的核心业务从开源向量数据库 Milvus 迁移至全托管的向量数据库云服务 Zilliz Cloud。 相比于 Milvus&#xff0c;Zilliz Cloud 实现了 Shulex VOC 评论分析洞察报告生成速度 30% 的提升…