Java队列有哪些?8大常用Java队列总结

news2024/11/18 11:25:51

什么是队列?

队列是一种操作受限的线性表,只允许在表的前端(front)进行删除操作又称作出队,在表的后端进行插入操作,称为入队,符合先进先出(First in First out)的特性。在队尾插入元素叫做入队,对头删除元素叫做出队。

比如我们常用的 LinkedList 集合,它实现了Queue 接口,我们可以理解为 LinkedList 就是一个队列。

Java队列分类?

Java 队列可以从不同的维度进行分类,例如:可以从阻塞和非阻塞进行分类;也可以从有界和无界进行分类;也可以从功能上进行分类,例如:优先队列、普通队列、双端队列、延迟队列等。

具体分类如下图所示:

Java常用的队列?

1.阻塞队列

阻塞队列区别于其他类型的队列的最主要的特点就是“阻塞”这两个字,如下图所示:

阻塞功能使得生产者和消费者两端的能力得以平衡,当有任何一端速度过快时,阻塞队列便会把过快的速度给降下来。

阻塞队列大致可以分为如下7类:

1)ArrayBlockingQueue

ArrayBlockingQueue是一个用数组实现的 有界阻塞队列。 此队列按照先进先出(FIFO)的原则对元素进行排序。

2)LinkedBlockingQueue

LinkedBlockingQueue是一个用链表实现的 有界阻塞队列,此队列的默认和最大长度为Integer.MAX_VALUE,此队列按照先进先出的原则对元素进行排序。

3)PriorityBlockingQueue

PriorityBlockingQueue是一个带优先级的队列,而不是先进先出队列,元素按优先级顺序被移除,而且它是无界的,也就是没有容量上限。
虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError 错误;

4)DelayQueue

Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。注意 DelayQueue 的所有方法只能操作“到期的元素“。

我们可以将DelayQueue运用在以下应用场景:

  • 缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了;
  • 定时任务调度:使用DelayQueue保存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行,从比如TimerQueue就是使用DelayQueue实现的。

5)SynchronousQueue

SynchronousQueue:最多只能存储一个元素,每一个put操作必须等待一个take操作,否则不能继续添加元素

6)LinkedTransferQueue

LinkedTransferQueue是一个由链表结构组成的 无界阻塞TransferQueue队列 ,相对于其他阻塞队列LinkedTransferQueue多了tryTransfer和transfer方法。

7)LinkedBlockingDeque

LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列。所谓双向队列指的你可以从队列的两端插入和移出元素。
双端队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争。

2.非阻塞队列

非阻塞队列也它的名字中不会包含 BlockingQueue 关键字,当队列满之后如果还有新元素入列会直接返回错误,并不会阻塞的等待着添加元素,如下图所示:

阻塞队列和非阻塞队列的区别:阻塞队列可以阻塞,非阻塞队列不能阻塞。

常见的非阻塞队列:

1)ConcurrentLinkedQueue

ConcurrentLinkedQueue:单向链表结构的无界并发队列, 非阻塞队列,由CAS实现线程安全,内部基于节点实现

2)ConcurrentLinkedDeque

ConcurrentLinkedDeque:双向链表结构的无界并发队列, 非阻塞队列,由CAS实现线程安全

3)PriorityQueue

PriorityQueue:内部基于数组实现,线程不安全的队列

3.双端队列

Deque表示双端队列,双端队列是在两端都可以进行插入和删除的队列。

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

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

相关文章

Rstudio开不开了怎么办?R is taking longer to start than usual

Rstudio Server 启动时卡死 在使用 linux 服务器版 RstudioServer 的过程中,发现出现了一个问题,导致没有办法正常载入工作页面,网页提示信息是“R is taking longer to start than usual”,直接翻译过来就是“这次启动 R 会比平常…

Unity RenderStreaming 云渲染-黑屏

🥪云渲染-黑屏 网页加载出来了,点击播放黑屏 ,关闭防火墙即可!!!!

$attrs,$listeners

vue实现组件通信的方式有: 父子通信 父组件向子组件传递通过props定义各个属性来传递,子组件向父组件传递通过$emit触发事件 ref也可以访问组件实例跨级通信 vuex bus provide / inject $attrs / $listeners解释 $attrs / $listeners $attrs 将父组件中…

Django实现音乐网站 ⒂

使用Python Django框架制作一个音乐网站, 本篇主要是歌手详情页-基本信息、单曲列表功能开发实现内容。 目录 歌手基本信息 增加路由 显示视图 模板显示 推荐歌手跳转详情 歌手增加基本信息 表模型增加字段 数据表更新 基本信息增加内容渲染 歌手单曲列表…

Watermark 是怎么生成和传递的?

分析&回答 Watermark 介绍 Watermark 本质是时间戳,与业务数据一样无差别地传递下去,目的是衡量事件时间的进度(通知 Flink 触发事件时间相关的操作,例如窗口)。 Watermark 是一个时间戳, 它表示小于该时间戳的…

SpringBoot进阶使用

参考自 4.Web开发进阶.pptx[1] 静态资源访问 默认将静态资源放到src/main/resources/static目录下,这种情况直接通过ip:port/静态资源名称即可访问(默认做了映射) 也可以在application.properties中通过spring.web.resources.static-locations进行设置 例如[2]&…

第63步 深度学习图像识别:多分类建模误判病例分析(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 上两期我们基于TensorFlow和Pytorch环境做了图像识别的多分类任务建模。这一期我们做误判病例分析,分两节介绍,分别基于TensorFlow和Pytorch环境的建模和分析。 本期以健康组、肺结核组、COVID-19组、细菌性&am…

Pytorch中如何加载数据、Tensorboard、Transforms的使用

一、Pytorch中如何加载数据 在Pytorch中涉及到如何读取数据,主要是两个类一个类是Dataset、Dataloader Dataset 提供一种方式获取数据,及其对应的label。主要包含以下两个功能: 如何获取每一个数据以及label 告诉我们总共有多少的数据 Datal…

终端登录github两种方式

第一种方式 添加token,Setting->Developer Setting 第二种方式SSH 用下面命令查看远程仓库格式 git remote -v 用下面命令更改远程仓库格式 git remote set-url origin gitgithub.com:用户名/仓库名.git 然后用下面命令生成新的SSH秘钥 ssh-keygen -t ed2…

Matlab图像处理-线性变换

线性变换 空间域处理技术是直接对图像的像素进行操作。灰度变换不改变原图像中像素的位置,只改变像素点的灰度值,并逐点进行,和周围的其他像素点无关。 灰度线性变换即是对图像的灰度做线性拉伸、压缩,映射函数为一个直线方程。…

【大数据】数据湖:下一代大数据的发展趋势

数据湖:下一代大数据的发展趋势 1.数据湖技术产生的背景1.1 离线大数据平台(第一代)1.2 Lambda 架构1.3 Lambda 架构的痛点1.4 Kappa 架构1.5 Kappa 架构的痛点1.6 大数据架构痛点总结1.7 实时数仓建设需求 2.数据湖助力于解决数据仓库痛点问…

137.只出现一次的数字

目录 一、题目 二、代码 一、题目 137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int singleNumber(vector<int>& nums) {int answer0;int count0;//用于计数for(int i0;i<32;i){count0;for(int j0;j&l…

Shell - 根据用户名查询该用户的相关信息

文章目录 #! /bin/bash # Function&#xff1a;根据用户名查询该用户的所有信息 read -p "请输入要查询的用户名&#xff1a;" A echo "------------------------------" ncat /etc/passwd | awk -F: $1~/^$A$/{print} | wc -l if [ $n -eq 0 ];then echo …

unity pivot and center

一般采用pivot即默认的模式 选中物体的轴心 Center中心 选中多个物体&#xff0c;两咱情况下旋转的效果也不一样 围绕各自中心旋转 Center 围绕中心旋转

K8s:一文认知 CRI,OCI,容器运行时,Pod 之间的关系

写在前面 博文内容整体结构为结合 华为云云原生课程 整理而来,部分内容做了补充课程是免费的&#xff0c;有华为云账户就可以看&#xff0c;适合理论认知&#xff0c;感觉很不错。有需要的小伙伴可以看看&#xff0c;链接在文末理解不足小伙伴帮忙指正 对每个人而言&#xff0c…

python 笔记(2)——文件、异常、面向对象、装饰器、json

目录 1、文件操作 1-1&#xff09;打开文件的两种方式&#xff1a; 1-2&#xff09;文件操作的简单示例&#xff1a; write方法: read方法&#xff1a; readline方法&#xff1a; readlines方法&#xff1a; 2、异常处理 2-1&#xff09;不会中断程序的异常捕获和处理…

在CentOS7中,安装并配置Redis【个人笔记】

一、拓展——Ubuntu上安装Redis 输入命令su --->切换到root用户【如果已经是&#xff0c;则不需要进行该操作】apt search redis --->使用apt命令来搜索redis相关的软件包【查询后&#xff0c;检查redis版本是否是你需要的&#xff0c;如果不是则需要看看其他资料~】ap…

QT可执行程序打包成安装程序

目录 1.将QT程序先放到一个文件中 2.下载QtInstallerFramework-win-x86.exe 3.将setup.exe单独拷贝出来&#xff0c;进行安装测试 4.测试安装后的程序是否可执行 1.将QT程序先放到一个文件中 &#xff08;1&#xff09;QT切换到release模式&#xff0c;编译后在构建目录生…

YOLOv5、YOLOv8改进:gnconv 门控递归卷积

1.简介 论文地址&#xff1a;https://arxiv.org/abs/2207.14284 代码地址&#xff1a;https://github.com/raoyongming/HorNet 视觉Transformer的最新进展表明&#xff0c;在基于点积自注意力的新空间建模机制驱动的各种任务中取得了巨大成功。在本文中&#xff0c;作者证明了…

【进程间通信】IPC对象(进程间通信的精髓)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…