java中常用的队列

2023-11-14

一、java中的队列

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

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

在这里插入图片描述

二、非阻塞队列

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

1. LinkedList

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

2. PriorityQueue

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

PriorityQueue 队列的头指排序规则最小那个元素。如果多个元素都是最小值则随机选一个。
PriorityQueue 是一个无界队列,但是初始的容量(实际是一个Object[]),随着不断向优先级队列添加元素,其容量会自动扩容,无需指定容量增加策略的细节。

3. ConcurrentLinkedQueue

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

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

4. 非阻塞队列的操作

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

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

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

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

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

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

  • isEmpty():队列是否为空

  • size():队列长度

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

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

三、阻塞队列

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

1. 阻塞队列

ArrayBlockingQueue :一个由数组支持的有界队列。
LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。

2. 阻塞队列的操作

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

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

  • put(E e):用来向队尾存入元素,如果队列满,则等待;
  • take():用来从队首取元素,如果队列为空,则等待;
  • offer(E e,long timeout, TimeUnit unit):用来向队尾存入元素,如果队列满,则等待一定的时间,当时间期限达到时,如果还没有插入成功,则返回false;否则返回true;
  • poll(long timeout, TimeUnit unit):用来从队首取元素。如果队列空,则会等待 timeout 时间后进行一次重试,如果取不到,则返回null;否则返回取得的元素;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中常用的队列 的相关文章

  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • 如何防止在 CXF Web 服务客户端中生成 JAXBElement

    我正在尝试使用 CXF 创建一个 Web 服务客户端来使用 WCF Web 服务 当我使用 wsdl2java 时 它生成具有 JAXBElement 类型而不是 String 的对象 我读到有关使用 jaxb bindings xml 文
  • 在 Android 中绘制一条带有弯曲边缘的线

    I am using canvas drawLine to draw some line in android but the lines are too sharp but i need a curved edges 这里的 1 是我所拥
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 如何屏蔽 Protobuf 中的某些字段

    我找不到一种方法来屏蔽 protobuf 结构中的某些字段 我确实阅读了有关 FieldMaskUtil 的内容并尝试了几个示例 但它似乎做了相反的操作 即复制 FieldMask 中提到的字段 这与我想要的不同 这是示例结构和相应的测试代
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • Hystrix是否可以订阅CircuitBreaker开启事件?

    对于单元测试 我希望能够订阅 Hystrix 事件 特别是在断路器打开或关闭时发生事件 我四处寻找示例 似乎解决方法是利用指标流并监视断路器标志 由于 Hystrix 是基于 RxJava 构建的 我认为应该在某个地方有一个事件订阅接口 在
  • JavaFx 中装饰且不可移动的舞台

    我想在 JavaFx 中创建一个装饰舞台 它也将不可移动 我正在从另一个控制器类创建这个阶段 我能够创造和展示舞台 但它是自由移动的 我怎样才能创建这个 非常感谢帮助和建议 我把打开新关卡的方法贴出来 private void addRec
  • 如何将txt文件添加到你的android项目中? [复制]

    这个问题在这里已经有答案了 我的Android studio版本是1 5 1 显然这个 never 版本没有 txt 文件的 asset 文件夹 您打算如何将这些文件包含到您的项目中 以及如何进一步使用您内部的应用程序 谢谢你的建议 Pro
  • 如何获取 Android 中临时文件的文件大小?

    如果我使用 openFileOutput 创建并写入临时文件 写入完成后如何获取文件大小 我希望这可以帮助你 File file new File selectedPath int file size Integer parseInt St
  • XSLT:我们可以使用abs值吗?

    我想知道在 XSLT 中我们是否可以使用 math abs 我在某处看到过这个 但它不起作用 我有类似的东西
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • 在 netBeans 中运行程序时,字体看起来非常奇怪

    我在我的新 MacBook M1 上设置了 netBeans 和 SceneBuilder 除了运行程序时的字体外 一切正常 它看起来像这样 我不知道为什么 按钮应显示 Click me 标签应显示 Hello 我收到的错误消息是 M rz
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • 如何使用 Hibernate Session.doWork(...) 进行保存点/嵌套事务?

    我正在使用 JavaEE JPA 托管事务与 Oracle DB 和 Hibernate 并且需要实现某种嵌套事务 据我所知 此类事情不受开箱即用的支持 但我应该能够为此目的使用保存点 正如建议的https stackoverflow co
  • 使用 Cucumber Scenario Outline 处理 Excel 电子表格

    如果可能的话 我试图找到一种更优雅的方法来处理从与 Excel 电子表格行 第 n 个 相关的 Cucumber Scenario Outline 中调用第 n 个数字 目前 我正在使用迭代编号来定义要从中提取数据的 Excel 电子表格的
  • Java中的媒体播放器库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在评估用于在 Java 中播放音频 视频的库 它不需要 100 Java Java 与本机库的绑定

随机推荐

  • kubernetes session保持等设置

    session保持 如何在service内部实现session保持呢 当然是在service的yaml里进行设置啦 在service的yaml的sepc里加入以下代码 sessionAffinity ClientIP sessionAffi
  • matplotlib怎么在一张图上画多条曲线?

    问题 多个plot画不到一张图上 解决方法 多个plot用一个plt show 即可 一次plt show 就会有一次输出 如何让函数画在同一张画布上 for i in range 1 15 3 train score test score
  • bh1750c语言程序,BH1750FVI数字光线强度传感器 51单片机源程序

    BH1750FVI IIC测试程序 使用单片机STC89C51 晶振 11 0592M 显示 LCD1602 编译环境 Keil uVision2 参考宏晶网站24c04通信程序 时间 2011年4月20日 include include
  • vue3表格导出excel

    下载依赖 npm install xlsx 引入依赖 import as XLSX from xlsx 使用
  • Python内置类型转换函数

    chr i chr 函数返回ASCII码对应的字符串 gt gt gt print chr 65 A gt gt gt print chr 66 B gt gt gt print chr 65 chr 66 AB complex real
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • C#委托、C++委托实现、C回调函数

    C 委托 C 中的委托 Delegate 定义了方法的类型 使得可以将方法当作另一个方法的参数来进行传递 这种将方法动态地赋给参数的做法 可以避免在程序中大量使用if else switch 语句 同时使得程序具有更好的可扩展性 委托特别用
  • 从NSGA到 NSGA II

    NSGA 非支配排序遗传算法 NSGAII 带精英策略的非支配排序的遗传算法 都是基于遗传算法的多目标优化算法 都是基于pareto最优解讨论的多目标优化 遗传算法已经做过笔记 下面介绍pareto 帕累托 最优解的相关概念 本文是基于参考
  • Qt实现俄罗斯方块

    在经过基础内容的学习和简单的小示例练习后 这节我们用Qt做个俄罗斯方块小游戏 本文会描述实现俄罗斯方块的部分思路 代码开源 详细可见代码 链接获取方式 开源代码已上传gitee 关注 程序媛讲QT 公众号 回复 俄罗斯方块 获取链接 俄罗斯
  • 三分钟理解Java中字符串(String)的存储和赋值原理

    可能很多Java的初学者对String的存储和赋值有迷惑 以下是一个很简单的测试用例 你只需要花几分钟时间便可理解 1 在看例子之前 确保你理解以下几个术语 栈 由JVM分配区域 用于保存线程执行的动作和数据引用 栈是一个运行的单位 Jav
  • react中的export什么函数能导出_esModuleInterop 到底做了什么?

    问题引入 很多 react 使用者在从 JS 迁移到 TS 时 可能会遇到这样一个问题 JS 引入 react 是这样的 js import React from react 而 TS 却是这样的 ts import as React fr
  • 个人号微信二次开发,微信ipad协议

    E云是什么 E云API 是一套完整的的微信第三方服务平台 包含个微API服务与企微API服务模块 本文档主要讲述个微API服务相关 以下简称API 它能处理用户微信中的各种事件 并辅助微信执行各种操作 提供了开发者与个人号对接的能力 技术上
  • 黑盒测试用例设计方法--场景法

    8 场景法 8 1定义 场景法是通过运用场景来对系统的功能点或业务流程的描述 从而提高测试效果的一种方法 场景法一般包含基本流和备用流 从一个流程开始 通过描述经过的路径来确定的过程 经过遍历所有的基本流和备用流来完成整个场景 场景主要包括
  • 使用Xshell连接Ubuntu

    1 6 1 使用Xshell连接Ubuntu 使用命令ifconfig查看虚拟机IP地址 如图1 xx所示 图1 xx 使用如下命令安装ssh 以让Xshell软件远程连接到Ubuntu系统中 sudo apt get install op
  • CSS行高(line-height)使文本垂直居中详解

    一 场景重现 在我们的静态页面设计中 在我们的块级元素中写入文字时 div class center 我想在中间 div center height 50px background color 008c8c 会发现我们最后在网页显示的效果为
  • PCB电路板上各种标志的含义

    目录 一 PCB电路板上各种标志的含义 1 防静电标志 2 WEEE标志 3 国内认证 4 全球认证 5 北美认证 6 欧盟认证 7 韩国认证 8 日本认证 9 澳大利亚认证 一 PCB电路板上各种标志的含义 链接 PCB电路板上各种标志的
  • vue3中使用百度地图BMAP

    在Vue3中使用百度地图 可以按照以下步骤进行 1 在项目中引入百度地图的API文件 可以在public index html文件中添加以下代码 其中 密钥可以在百度地图开放平台申请 2 在需要使用地图的组件中引入BMap对象和BMapGL
  • Prompt GPT推荐社区

    大家好 我是荷逸 这次给大家带来的是我日常学习Prompt社区推荐 Snack Prompt 访问地址 http snackprompt com Snack Prompt是一个采用的Prompts诱导填空式的社区 它提供了一种简单的prom
  • vpdn-l2tp(cisco)

    ra config interface serial 1 0 config if ip add 173 16 1 1 255 255 255 252 config if no sh config if exit config vpdn en
  • java中常用的队列

    一 java中的队列 Queue 基本上 一个队列就是一个先入先出 FIFO 的数据结构 Queue接口与List Set同一级别 都是继承了Collection接口 LinkedList实现了Deque接口 二 非阻塞队列 非阻塞队列不能