《Java并发编程的艺术》之阻塞队列

阻塞队列是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法:

1) 支持阻塞的插入方法:当队列满时,队列会阻塞执行插入的线程
2) 支持阻塞的移除方法:当队列空时,队列会阻塞执行移除的线程

方法总结:

方法/处理方式抛出异常返回特殊值一直阻塞超时退出
插入方法add(e)offer(e)put(e)offer(e, time, unit)
移除方法poll()take()poll(time, unit)
检测方法element()peek()
  • 抛出异常:当队列满时,插入元素会抛出IllegalStateException
  • 返回特殊值:offer()是入队方法,当插入成功时返回true,插入失败返回false;poll()是出队方法,当出队成功时返回元素的值,队列为空时返回null
  • 一直阻塞:当队列满时,阻塞执行插入方法的线程;当队列空时,阻塞执行出队方法的线程
  • 超时退出:顾名思义

在JDK7里,Java的阻塞队列总共有七个,每个类都继承AbstractQueue

  • ArrayBlockingQueue
  • LinkedTransferQueue
  • SynchronousQueue
  • DelayQueue
  • LinkedBlockingDeque
  • LinkedBlockingQueue
  • PriorityBlockingQueue

ArrayBlockingQueue

该类是通过数组实现的有界阻塞队列,此队列按照FIFO的原则对元素进行排列。默认情况下不保证线程公平的访问队列,所谓公平访问是指阻塞的线程,可以按照阻塞的先后顺序访问队列,即先阻塞的先访问。公平访问是由ReentrantLock的公平锁实现的:

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();
}
  1. 因为直接创建的数组,ArrayBlockingQueue的长度无法更改,
  2. 当ReentrantLock设置为公平锁后,后续所有Lock竞争中都会是公平竞争,没看过Condition原理的小伙伴会想,那和Condition有什么关系呢?答案是Condition在被唤醒时也要参与竞争Lock,那么在Lock竞争中都会遵守公平竞争。

LinkedBlockingQueue

该类是一个用链表实现的有界阻塞队列(也不算有界,只是因为计数器最多只能计Integer.MAX_VALUE)。此队列的默认和最大长度为Integer.MAX_VALUE。按照先进先出的原则对元素进行排列。

PriorityBlockingQueue

该类是一个支持优先级的无界阻塞队列。默认情况下元素采取自然升序的排序方式。也可以自定义类实现compareTo()来指定元素排序规则,或者初始化时指定Comparator来对元素排序。
详见:坑还没填,迟点填

DelayQueue

支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现,队列中的元素必须实现Delayed接口,再创建元素时可以指定多久才能从队列中获取当前原色,只有在延迟期满时才能从队列中提取元素。
运用场景:

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

执行流程如下所示:

首先实现Delayed接口:
java @Override public long getDelay(TimeUnit unit){ // 返回当前元素还需要等待多久,当返回<0的值时,表示可以出队;>0时,表示仍需要等待 }

第二步,每次offer()时,往PriorityQueue插入元素会自行排序,按照自然升序排序

第三步,每次获取时(调用take(),才能有阻塞的功能),如果时间未满会先阻塞

for (;;) {E first = q.peek();if (first == null)available.await();else {long delay = first.getDelay(NANOSECONDS);if (delay <= 0)return q.poll();first = null; // don't retain ref while waitingif (leader != null)available.await();else {Thread thisThread = Thread.currentThread();leader = thisThread;try {available.awaitNanos(delay);} finally {if (leader == thisThread)leader = null;}}}
}

具体的可以看: 了解之DelayQueue

SynchronousQueue

一个不存储元素的队列,生产者生产一个,消费者消费一个,每一个put操作都需要等待一个take操作。该队列主要负责生产者线程处理的数据传递给消费者线程。比较适合传递性场景。其吞吐量高于ArrayBlockingQueue和LinkedBlockingQueue

LinkedTransferQueue

该类主要添加了两个方法:transfer()tryTransfer()
transfer() 主要是当消费者线程在等待的时候,生产者一产生元素,就立刻交给消费者,不需要再进行额外的入队操作;如果没有消费者在等待,就先进入队尾。
tryTransfer() 用来试探生产者传入的元素是否能直接传给消费者。

具体的可以看:了解之LinkedTansferQueue

总结

  • ArrayBlockingQueue
  • LinkedBlockingQueue
  • LinkedBlockingDeque
  • SynchronousQueue
    上面四个是较为简单的,数据结构和各个方法都较为简单就不一一阐述了。剩下三个则是比较大头的,而且比较新颖,打算单独拎出来讲解

该章主要是粗略的了解一下其他阻塞队列的功能,对于一些不常见的类,后续会补上详细的分析(其实是先补充一波数据结构和算法)

转载于:https://www.cnblogs.com/codeleven/p/10963265.html

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

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

相关文章

spring学习(6):使用xml方式实现spring基本应用

接着上一节的课程继续学习 在resources文件下建立applicationconText applicationconText.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3…

[burp][CTF]burp intruder爆破出现 Payload set 1: Invalid number settings的解决办法

这是一个软件bug 如果点击start attrack 后出现 Payload set 1: Invalid number settings 的提示&#xff0c;先点hex 后点 decimal 再开始start attrack&#xff0c;需要手动让它刷新。

数据结构五——二叉树

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 树 1.1 概念 概念&#xff1a;树、根、父节点、子节点、叶子节点。 几个度&#xff1a;高度、深度、层。与实际生活中的这几个概念类比。 高度&#xff1a;从下往…

spring学习(7):加入log4g日志系统

点击show dependencies popup 修改pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

[hackinglab][CTF][脚本关][2020] hackinglab 脚本关 writeup

脚本关 1 key又又找不到了 关键字&#xff1a; 知识点&#xff1a; 步骤:点击提供的链接后&#xff0c;实际发生了两次跳转&#xff0c;key 在第一次跳转的网页中&#xff0c;key is : yougotit_script_now 脚本关 2 快速口算 关键字&#xff1a; 知识点&#xff1a;python基…

plsql 记录型变量

set serveroutput ondeclareemplist emp%rowtype;beginselect * into emplist from emp where empno7839; dbms_output.put_line(emplist.ename||的薪水是||emplist.sal); end; / 转载于:https://www.cnblogs.com/wangchuanfu/p/10963851.html

用递归树求解递归算法时间复杂度

文章内容、图片均来自极客时间。 递归代码复杂度分析起来比较麻烦。一般来说有两种分析方法&#xff1a;递推公式和递归树。 1 递推公式法 归并排序的递推公式是&#xff1a; merge_sort(p…r) merge(merge_sort(p…q), merge_sort(q1…r)) 终止条件&#xff1a; p > r …

spring学习(8):log4j.properties 详解与配置步骤

一、入门实例 1.新建一个JAva工程&#xff0c;导入包log4j-1.2.17.jar&#xff0c;整个工程最终目录如下 2、src同级创建并设置log4j.properties ### 设置### log4j.rootLogger debug,stdout,D,E### 输出信息到控制抬 ### log4j.appender.stdout org.apache.log4j.ConsoleAp…

[hackinglab][CTF][注入关][2020] hackinglab 注入关 writeup

服务器挂了 咕咕咕 参考链接&#xff1a;https://blog.csdn.net/weixin_41924764/article/details/107095963?utm_mediumdistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_sourcedistribute.pc_relevant_t0.none-task-bl…

数据结构六——堆

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 堆定义 1.1 定义和结构 堆是一个完全二叉树&#xff08;完全二叉树&#xff1a;除了叶子节点外每一层节点都是满的&#xff0c;最后一层的子节点都靠左排列&…

学习进度13

时间15h代码量200行知识点 php连接数据库 jsp连接数据库 转载于:https://www.cnblogs.com/my---world/p/10964250.html

spring学习(9):idea的config配置

点开eventlog 点击之后 勾选 apply---ok

[hackinglab][CTF][上传关][2020] hackinglab 上传关 writeup

上传关 1 请上传一张jpg格式的图片 关键字&#xff1a; 步骤&#xff1a; 1.F12查看源码 2.输入网址 获得key http://lab1.xseclab.com/upload1_a4daf6890f1166fd88f386f098b182af/upload_file.php上传关 2 关键字&#xff1a;burp 知识点&#xff1a; 步骤&#xff1a;看源…

靠谱的Pycharm安装详细教程

如何在本机上下载和安装Pycharm&#xff0c;具体的教程如下&#xff1a; 1、首先去Pycharm官网&#xff0c;或者直接输入网址&#xff1a;http://www.jetbrains.com/pycharm/download/#sectionwindows&#xff0c;下载PyCharm安装包&#xff0c;根据自己电脑的操作系统进行选择…

数据结构六——堆的应用

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 堆比较适合动态数据的场景。 1 应用一&#xff1a;优先级队列 一个优先级队列就是一个堆。 1.1 合并小文件 假设我们有100个小文件。每个文件中的字符串按照从小到…

第四十四期:Keep突然大裁员,回应称“属正常调整”!

10 月 24 日程序员节原本是程序员们最开心的一天&#xff0c;但 Keep 程序员却开心不起来&#xff0c;因为不少人突然面临失业危机。\ 作者&#xff1a;51CTO 10 月 24 日程序员节原本是程序员们最开心的一天&#xff0c;但 Keep 程序员却开心不起来&#xff0c;因为不少人突然…

[hackinglab][CTF][解密关][2020] hackinglab 解密关 writeup

咕咕咕 暂时发现写得最好的 参考链接&#xff1a;https://blog.csdn.net/s0mor/article/details/102969444 参考链接&#xff1a;https://zhuanlan.zhihu.com/p/21740238?referquickresponse

oracle备份和还原

用exp命令即可完成&#xff0c;但要看具体的备份方式。  1. 导出一个完整数据库    exp system/manager filebible_db logdible_db fully    2. 导出数据库定义而不导出数据    exp system/manager filebible_db logdible_db fully rowsn    3. 导出一个或一…

第四十五期:万亿级日访问量下,Redis在微博的9年优化历程

Redis在微博内部分布在各个应用场景&#xff0c;比如像现在春晚必争的“红包飞”活动&#xff0c;还有像粉丝数、用户数、阅读数、转评赞、评论盖楼、广告推荐、负反馈、音乐榜单等等都有用到Redis。 作者&#xff1a;兰将州来源 一、Redis在微博的应用场景 Redis在微博内部…

数据结构七——图

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 基本概念 顶点、边 微信&#xff1a;A和B是好朋友&#xff0c;B也和A是好朋友&#xff0c;A和B之间有条边。 入度&#xff1a;每个顶点链接的边的个数每个人好朋友…