【Java并发编程的艺术】Java并发容器和框架:Java中的阻塞队列

2023-11-03

在这里插入图片描述

1.什么是阻塞队列

阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是 从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。
1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。
2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。

在阻塞队列不可用时,这两个附加操作提供了4种处理方式
在这里插入图片描述

2.Java里的阻塞队列

JDK7提供了7个阻塞队列

2.1 ArrayBlockingQueue

由数组结构组成的有界阻塞队列。
此队列按照FIFO的原则对元素进行排序。

2.2 LinkedBlockingQueue

用链表结构组成的有界阻塞队列。
此队列按照FIFO的原则对元素进行排序。
此队列默认和最大长度为Integer.MAX_VALUE。(如果不指定容量,默认为无界队列Integer.MAX_VALUE)

应用:FixedThreadPool、SingleThreadExecutor

2.3 PriorityBlockingQueue

支持优先级排序的无界阻塞队列。默认情况下采取自然顺序升序排列。
不能保证同优先级元素的顺序

2.4 DelayQueue

使用优先级队列实现的无界阻塞队列。支持延时获取元素。队列中的元素必须实现Delayed接口,再创建元素时可以指定多久才能从队列中获取当前元素。只有在延时期满时才能从队列中提取元素。

实现方式省略。

应用:ScheduledThreadPoolExecutor

2.5 SynchronousQueue

不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。
它的吞吐量高于ArrayBlockingQueue和LinkedBlockingQueue。

它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。

应用:CachedThreadPool

2.6 LinkedTransferQueue

由链表结构组成的无界阻塞TransferQueue队列。
在这里插入图片描述

2.7 LinkedBlockingDeque

由链表结构组成的双向阻塞队列。

在初始化LinkedBlockingDeque时可以设置容量防止其过度膨胀。另外,双向阻塞队列可以运用在“工作窃取”模式中。

3.阻塞队列的实现原理

使用通知模式实现
ArrayBlockingQueue使用了Condition来实现。

当往队列里插入一个元素时,如果队列不可用,那么阻塞生产者主要通过LockSupport.park(this)来实现。

park这个方法会阻塞当前线程,只有以下4种情况中的一种发生时,该方法才会返回。
1.与park对应的unpark执行或已经执行时。“已经执行”是指unpark先执行,然后再执行park的情况。
2.线程被中断时。
3.等待完time参数指定的毫秒数时。
4.异常现象发生时,这个异常现象没有任何原因。

当线程被阻塞队列阻塞时,线程会进入WAITING(parking)状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java并发编程的艺术】Java并发容器和框架:Java中的阻塞队列 的相关文章

  • 在java中将StreamWriter转换为OutputStream?

    我正在尝试使用 System setOut 将 System out 重定向到字符串 它需要一个 PrintStream 有什么方法可以将 StringWriter 转换为 Stream 以便我可以将其传递给 setOut 吗 你不能完全这
  • 如何在java swing中的每个页面中打印带有页脚的整个JPanel

    好吧 这可能很简单 但想不通 我有一个包含 JTable 的 JPanel JTable 包含很少的行 有时更多 因为我推入其中的表模型取决于数据库 但是 我不使用任何包含 JTable 的 JScolpane 因此 当 JTable 包含
  • Firebase 查询 Or'ing whereEqualTo 以获得可能值的列表

    我见过之前针对早期版本的 Firebase 提出过这个问题 https stackoverflow com questions 26700924 query based on multiple where clauses in fireba
  • Java Swing:清除JList而不触发监听器

    我的情况如下 我有一个 JList 只要在列表中进行选择 它就会触发搜索 使用 ListSelectionListener 我正在尝试使用以下命令重置列表上的选择list clearSelection 这样做的问题是使用clearSelec
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • 独占锁定ConcurrentHashMap

    我知道不可能锁定 ConcurrentHashMap 进行独占访问 但是 我找不到原因 是因为构成CHM的 Segment 没有被api公开吗 据推测 如果是的话 客户端代码可以执行 交接 锁定 Cheers 我知道不可能锁定 Concur
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java G1 GC 处理引用对象运行缓慢

    我已经在 J ava 上运行了计数器 它24小时工作 每秒点击通过100次左右 白天 GC 处理时间从 20 60 毫秒缓慢上升到 10000 60000 毫秒 然后下降到 20 60 毫秒 这种模式不时地重复 从 GC 日志中我发现 GC
  • 源服务器未找到目标资源的当前表示或不愿意透露该表示存在

    web xml
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr

随机推荐

  • HECO使用docker部署单节点的开发网

    文章目录 一 编写说明 1 1 文档说明 1 2 配置信息 1 3 部署文档信息 二 heco开发网镜像生成 三 heco主链容器生成 3 1 配置文件编写 3 2 预先创建一个账户地址 3 3 创建genesis json 3 4 初始化
  • Android加密 看雪,Android加密与解密入门两题

    写在最前面 本次题目来自看雪2w班9月题 密码学一直是安全的基础 Android安全也不例外 这次9月份的题分别从java层和C层考察了密码学中常用的对称加密 hash函数以及一些基础的编码 但是不是单纯的算法分析题 可以说是很好的练习题了
  • ResNet网络加入CBAM注意力机制

    首先定义resnet cbam py 如图 import torch import torch nn as nn import math import torch utils model zoo as model zoo all ResNe
  • python中retry的用法

    异常重试retry retry是一个用于错误处理的模块 功能类似try except 但更加快捷方便 retry模块中retry 的基本用法 retry 的功能是在其装饰的函数运行报错后重新运行该函数 retry 有几个主要参数 excep
  • Vert.x:一个简单的Tcp客户端和服务端demo

    1 声明 当前内容主要为记录和学习使用Vert x创建Tcp服务并实现通信的demo 当前内容参考官方文档 2 Server Demo import io vertx core AbstractVerticle import io vert
  • C++day3(设计一个Per类,类中包含私有成员:姓名、年龄...)

    1 设计一个Per类 类中包含私有成员 姓名 年龄 指针成员身高 体重 再设计一个Stu类 类中包含私有成员 成绩 Per类对象 p1 设计这两个类的构造函数 析构函数和拷贝构造函数 include
  • 力扣(LeetCode)257. 二叉树的所有路径

    给定一个二叉树 返回所有从根节点到叶子节点的路径 说明 叶子节点是指没有子节点的节点 示例 输入 1 2 3 5 输出 1 gt 2 gt 5 1 gt 3 解释 所有根节点到叶子节点的路径为 1 gt 2 gt 5 1 gt 3 通过次数
  • L1-003 个位数统计

    给定一个 k 位整数 N dk 1 10k 1 d1 101 d0 0 di 9 i 0 k 1 dk 1 gt 0 请编写程序统计每种不同的个位数字出现的次数 例如 给定 N 100311 则有 2 个 0 3 个 1 和 1 个 3 输
  • win 10升级后不能访问服务器文件夹,Win10系统文件夹无法访问拒绝访问怎么办?...

    不知道大家是否遇到过 访问某些文件夹的时候 出现提示 无法访问拒绝访问该文件夹 那么 Win10系统文件夹无法访问拒绝访问怎么办呢 下面 我们就一起往下看看Win10系统文件夹无法访问拒绝访问的解决方法 方法 步骤 1 右键点击无权访问的文
  • layui向body添加html_layui添加动态菜单与选项卡 AJAX请求的例子

    如下所示 HTMLLayui index js layui use element function function checkLastItem arr i return arr length i 1 function getAhtml
  • Jenkins学习篇之在Jenkins上配置kubernetes

    Jenkins是现在比较成熟的CICD管理平台 官方提供了丰富的插件用来配置CICD流程 这篇博客 记录一下在Jenkins上配置kubernetes的过程 希望对你有帮助 一 安装kubernetes插件 1 在插件管理里面搜索kuber
  • Spring Cloud中间件

    一 Nacos Ribbon Nacos介绍请参考 什么是 Nacos 下载 https github com alibaba nacos releases page 3 安装方法 Nacos 快速开始 运行nacos 切换到bin目录 在
  • 计算机基础知识及其能力调查问卷,大学新生计算机能力调查和分析.doc

    大学新生计算机能力调查和分析 大学新生计算机能力调查和分析 摘 要 本文在分析我院来自不同地区大学新生计算机能力存在较大差异的基础上 介绍了新生计算机能力调查问卷的设计方法 对我院2008级新生的调查结果作了具体分析 并提出了相应教改措施
  • 数据结构与算法分析 C语言描述(原书第2版)电子书pdf下载

    数据结构与算法分析 C语言描述 原书第2版 下载链接 https pan baidu com s 1VrsrvtCujFHbseuJjXJACA 提取码获取方式 关注下面微信公众号 回复关键字 1136
  • TypeScript入门-9.函数箭头表达式

    箭头表达式是function 匿名函数的简写 旨在解决javascript的this指向问题 写函数的时候也更简洁 函数一个参数的时候小括号可以不 写 写在一行后面的大括号可以不写 return也可以不写 如果写了大括号就必须加上retur
  • 【华为OD机试真题2023 JS】寻找核酸检测点

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 寻找核酸检测点 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 张三要去外地出差 需要做核酸 需要在指定时间点前做完核酸 请帮他找到满足条件的核酸检测点 1 给出
  • jenkinsci/blueocean:latest

    Jenkins maven配置 MVN3 mvn clean package Dmaven test skip true Dmaven javadoc skip true Javadoc 用于描述类或者方法的作用 Javadock可以写在类
  • 嵌入式Qt开发—Excel表格数据导出

    有一个嵌入式Excel表格数据导出的需求 应用软件运行于嵌入式Linux平台上 在设备运行过程中 存储了许多数据 这些数据想以表格的形式导出 考虑到Windows平台的普遍性 需要将数据以excel表格形式导出 故选择了一个开源库 QtXl
  • IJCAI 2023 直播预告

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 哔哩哔哩直播通道 扫码关注AI TIME哔哩哔哩官方账号预约直播 15 00 15 20 廖馨婷 基于双曲空间探索的非独立同分布联邦学习 15 20 15 40 吴南楠 面向不平
  • 【Java并发编程的艺术】Java并发容器和框架:Java中的阻塞队列

    1 什么是阻塞队列 阻塞队列常用于生产者和消费者的场景 生产者是向队列里添加元素的线程 消费者是 从队列里取元素的线程 阻塞队列就是生产者用来存放元素 消费者用来获取元素的容器 阻塞队列 BlockingQueue 是一个支持两个附加操作的