一、Java 中的队列

Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构。

Queue 接口与 List、Set同一级别,都是继承了Collection接口。

队列分为两大类:非阻塞队列和阻塞队列

二、非阻塞队列

非阻塞队列不能阻塞,多线程时,当队列满或者队列空时,只能使用队列 wait(),notify() 进行队列消息传送。

1. LinkedList(基于链表的FIFO队列)

LinkedList 除了实现的 List 接口,也实现了 Deque 接口,可以当做双端队列来使用。

2. ArrayDeque(数组双端队列)

ArrayDequeDeque接口的一个实现,使用了可变数组,所以没有容量上的限制。同时,ArrayDeque是线程不安全的,在没有外部同步的情况下,不能在多线程环境下使用。

ArrayDequeDeque的实现类,可以作为栈来使用,效率高于Stack;也可以作为队列来使用,效率高于LinkedList。需要注意的是,ArrayDeque不支持null值。

3. PriorityQueue(优先级队列)

PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。该队列不允许使用 null 元素也不允许插入不可比较的对象

PriorityQueue 队列的头指排序规则最小那个元素。如果多个元素都是最小值则随机选一个。

PriorityQueue 是一个无界队列,但是初始的容量(实际是一个Object[]),随着不断向优先级队列添加元素,其容量会自动扩容,无需指定容量增加策略的细节。

4. ConcurrentLinkedQueue(基于链表的并发队列)

ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列(CAS)。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大小,ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。

同样此队列不允许使用null元素,

非阻塞队列的操作方法
  • add(E e):将元素 e 插入到队列末尾,如果插入成功,则返回 true;如果插入失败(即队列已满),则会抛出异常;

  • remove():移除队首元素,若移除成功,则返回 true;如果移除失败(队列为空),则会抛出异常;

  • remove(Object o):移除指定的元素,若移除成功,则返回 true;如果移除失败(队列为空),则会抛出异常

  • offer(E e):将元素 e 插入到队列末尾,如果插入成功,则返回 true;如果插入失败(即队列已满),则返回 false;

  • poll():移除并获取队首元素,若成功,则返回队首元素;否则返回 null;

  • peek():获取队首元素,若成功,则返回队首元素;否则返回 null

  • isEmpty():队列是否为空

  • size():队列长度

对于非阻塞队列,一般情况下建议使用 offer、poll 和 peek 三个方法,不建议使用 add 和 remove 方法。因为使用 offer、poll 和 peek 三个方法可以通过返回值判断操作成功与否,而使用 add 和 remove 方法却不能达到这样的效果。

注意:非阻塞队列中的方法都没有进行同步措施。

三、阻塞队列

阻塞队列可以阻塞,当阻塞队列当队列里面没有值时,会阻塞直到有值输入。输入也一样,当队列满的时候,会阻塞,直到队列有空间。

1. 阻塞队列
  • ArrayBlockingQueue :一个由数组支持的有界队列。(基于数组的并发阻塞队列)
  • LinkedBlockingQueue :一个由链接节点支持的可选有界队列。(基于链表的FIFO阻塞队列)
  • PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。(带优先级的无界阻塞队列)
  • DelayQueue :一个由优先级堆支持的、基于时间的调度队列。(延期阻塞队列)
  • SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
2. 阻塞队列的操作方法

阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,但是要注意这5个方法在阻塞队列中都进行了同步措施。

除此之外,阻塞队列提供了另外4个非常有用的方法:

  • put(E e):用来向队尾存入元素,如果队列满,则等待;
  • take():用来从队首取元素,如果队列为空,则等待;
  • offer(E e,long timeout, TimeUnit unit):用来向队尾存入元素,如果队列满,则等待一定的时间,当时间期限达到时,如果还没有插入成功,则返回false;否则返回true;
  • poll(long timeout, TimeUnit unit):用来从队首取元素,如果队列空,则等待一定的时间,当时间期限达到时,如果取到,则返回null;否则返回取得的元素;

JavaSE 中的队列简介的更多相关文章

  1. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  2. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  3. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  4. JavaSE中线程与并行API框架学习笔记1——线程是什么?

    前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...

  5. JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

    前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...

  6. javaSE中JDK提供的四种线程池

    对javaSE中JDK提供的四种线程池稍作整理   一.Executor   package java.util.concurrent; /** * @since 1.5 * @author Doug ...

  7. php标准库中QplQueue队列如何使用?

    php标准库中QplQueue队列如何使用? 一.总结 1.new对象,然后通过enqueue方法和dequeue方法使用. 二.php标准库中QplQueue队列如何使用? 队列这种数据结构更简单, ...

  8. java中使用队列:java.util.Queue (转)

    Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接 口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类 ...

  9. iOS多线程中,队列和执行的排列组合结果分析

    本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到 ...

  10. Oracle中PL/SQL简介、基本语法以及数据类型

    Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控 ...

随机推荐

  1. CentOS 使用 IUS _ SCL 第三方软件源

    CentOS 使用 IUS / SCL 第三方软件源 使用centos 经常发现官方提供的软件包版本过低,很多时候大家会选择下载源码自行编译,带来了很多麻烦. centos安装最新版本软件包,例如gi ...

  2. 记一次 .NET 某发证机系统 崩溃分析

    一:背景 1. 讲故事 前些天有位朋友在微信上找到我,说他的系统有偶发崩溃,自己也没找到原因,让我帮忙看下怎么回事,我分析dump一直都是免费的,毕竟对这些东西挺感兴趣,有问题可以直接call我,好了 ...

  3. HyperWorks分析模型的建立与边界条件施加

    在HyperWorks完成了基本的网格剖分后,还需要赋予模型各类与求解相关的信息,方能最终生成可以递交求解器计算的输入文件.分析模型的建立与载荷及边界条件的创建包括以下内容: -定义待输出的目标求解器 ...

  4. 【Playwright + Python】系列(十七)揭秘 Playwright 处理 Handles:开启高效自动化之门

    哈喽,大家好,我是六哥!今天来跟大家聊一聊Playwright 处理 Handles的方法,面向对象为功能测试及零基础小白,这里我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先收藏,以免后 ...

  5. 你的终端AI副驾

    Google 重磅推出了 Gemini CLI,这是一款基于 Gemini 大模型驱动的命令行工具. 它把强大的生成式 AI 能力无缝整合进终端,能通过自然语言对话帮你写代码.梳理项目.自动化任务等, ...

  6. linux0.01代码阅读

    代码地址: https://cdn.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz 代码目录: main函数: 代码中的命名解释: CMO ...

  7. TypeScript(TS)JavaScript(JS)中的所有循环方法

    for循环: for (let i = 0; i < array.length; i++) { // 循环体 } for-of循环: for (const element of array) { ...

  8. [原创]《C#高级GDI+实战:从零开发一个流程图》第06章:繁琐?没扩展性?抽象!抽象!

    一.前言 前面的课程我们实现了两种形状:矩形.圆形,在第4章的时候就会发现,仅增加了个新形状,代码量及判断逻辑就翻倍不止,异常繁琐,可维护性很差,更没有扩展性可言.我们本节课就来解决这一点,解决的方法 ...

  9. 前端开发系列120-进阶篇之deepClone

    本文讨论数据的拷贝,并给出深拷贝的实现代码. 拷贝即复制( copy | clone ),获取指定数据副本的一种行为,理论上我们可以对任意类型的数据进行拷贝,包括但不限于null.undefined. ...

  10. SciTech-Physics-Particle-Quantum Theories-Heisenberg Uncertainty Principle: 量子理论核心: 海森堡不确定性原理 的 数学公式 + 波函数 度量 量子粒子的空间位置分布

    名词解释 动量: 一个vector, 既有 "速度",也有"方向". 波粒双性: 量子粒子(如电子),既有粒子性,也有波动性. 波函数: 在量子力学,粒子的位置 ...