1、ArrayBlockingQueue

ArrayBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection接口。底层以数组的形式保存数据(实际上可看作一个循环数组)。常用的操作包括 add,offer,put,remove,poll,take,peek。

2、DelayQueue 延时队列

DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走,内部用 PriorityQueue。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。

3、DelayedWorkQueue优先级队列(堆队列)

该队列是定制的优先级队列,只能用来存储RunnableScheduledFutures任务。堆是实现优先级队列的最佳选择,而该队列正好是基于堆数据结构的实现。它会对插入的数据进行优先级排序,保证优先级越高的数据首先被获取,与数据的插入顺序无关。

4、LinkedBlockingDeque

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

相比于其他阻塞队列,LinkedBlockingDeque多了addFirst、addLast、peekFirst、peekLast等方法,以first结尾的方法,表示插入、获取获移除双端队列的第一个元素。以last结尾的方法,表示插入、获取获移除双端队列的最后一个元素。

5、LinkedBlockingQueue

LinkedBlockingQueue内部由单链表实现,只能从head取元素,从tail添加元素。添加元素和获取元素都有独立的锁,也就是说LinkedBlockingQueue是读写分离的,读写操作可以并行执行。

LinkedBlockingQueue采用可重入锁(ReentrantLock)来保证在并发情况下的线程安全。

6、LinkedTransferQueue

LinkedTransferQueue是在JDK1.7时,J.U.C包新增的一种比较特殊的阻塞队列,它除了具备阻塞队列的常用功能外,还有一个比较特殊的transfer方法。

我们知道,在普通阻塞队列中,当队列为空时,消费者线程(调用take或poll方法的线程)一般会阻塞等待生产者线程往队列中存入元素。而LinkedTransferQueue的transfer方法则比较特殊:

当有消费者线程阻塞等待时,调用transfer方法的生产者线程不会将元素存入队列,而是直接将元素传递给消费者;

如果调用transfer方法的生产者线程发现没有正在等待的消费者线程,则会将元素入队,然后会阻塞等待,直到有一个消费者线程来获取该元素。

7、PriorityBlockingQueue

PriorityBlockingQueue是一个支持优先级的无界阻塞队列,直到系统资源耗尽。默认情况下元素采用自然顺序升序排列。也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序。但需要注意的是不能保证同优先级元素的顺序。PriorityBlockingQueue也是基于最小二叉堆实现,使用基于CAS实现的自旋锁来控制队列的动态扩容,保证了扩容操作不会阻塞take操作的执行。

8、SynchronousQueue

SynchronousQueue 也是一个队列,但它的特别之处在于它内部没有容器,一个生产线程,当它生产时(即put的时候),如果当前没有人想要消费产品(即当前没有线程执行take),此生产线程必须阻塞,等待一个消费线程调用take操作,take操作将会唤醒该生产线程,同时消费线程会获取生产线程的产品(即数据传递),这样的一个过程称为一次配对过程(当然也可以先take后put,原理是一样的)

SynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。

BlockingQueue队列有哪些相关推荐

  1. java queue通信_Java -- 使用阻塞队列(BlockingQueue)控制线程通信

    BlockingQueeu接口是Queue的子接口,但是它的主要作用并不是作为容器,而是作为线程同步的工具. 特征: 当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则该线程 ...

  2. java blockingqueue_Java多线程进阶(三一)—— J.U.C之collections框架:BlockingQueue接口...

    一.引言 从本节开始,我们将介绍juc-collections框架中的"阻塞队列"部分.阻塞队列在实际应用中非常广泛,许多消息中间件中定义的队列,通常就是一种"阻塞队列& ...

  3. Java高并发之BlockingQueue

    前言碎语 当系统流量负载比较高时,业务日志的写入操作也要纳入系统性能考量之内,如若处理不当,将影响系统的正常业务操作,之前写过一篇<spring boot通过MQ消费log4j2的日志>的 ...

  4. java 队列的使用

    在Java的并发包中已经提供了BlockingQueue的实现,比较常用的有ArrayBlockingQueue和LinkedBlockingQueue,前者是以数组的形式存储,后者是以Node节点的 ...

  5. Android 之BlockingQueue

    BlockingQueue BlockingQueue 是新增的Concurrent包中的一种阻塞队列 特点 当BlockingQueue为空, 从队列取数据时会让线程等待状态,直到能取出非空的数据, ...

  6. 生产者-消费者中的缓冲区:BlockingQueue接口

    BlockingQueue接口使用场景 相信大家对生产者-消费者模式不陌生,这个经典的多线程协作模式,最简单的描述就是生产者线程往内存缓冲区中提交任务,消费者线程从内存缓冲区里获取任务执行.在生产者- ...

  7. 锁与并发工具包与线程池与LockSupport与Fork/Join框架与并行流串行流与阻塞队列与JPS,jstack命令查看死锁查看线程状态与AQS个人笔记九

    朝闻道,夕死可矣 本文共计 86564字,估计阅读时长1小时 点击进入->Thread源码万字逐行解析 文章目录 本文共计 86564字,估计阅读时长1小时 一锁 二Java中13个原子操作类 ...

  8. disruptor框架为什么不流行_从构建分布式秒杀系统聊聊Disruptor高性能队列

    前言 秒杀架构持续优化中,基于自身认知不足之处在所难免,也请大家指正,共同进步.文章标题来自码友的建议,希望可以把阻塞队列ArrayBlockingQueue这个队列替换成Disruptor,由于之前 ...

  9. OOM分析之问题定位(二)

    一.背景 上一篇OOM分析之问题定位(一)中讲到通过单例模式可以有效的减少内存使用.但是随着压测并发数的不断提高,QRCodeTask对象不断增加,内存占用相应也会一直增加.再加上QRCodeTask ...

最新文章

  1. ThinkPHP5.0中Redis的使用和封装
  2. AIR for IOS开发问题小结
  3. 【学术相关】科技论文写作:grammerly润色工具
  4. MAC终端安装grunt--javascript世界得构建工具
  5. 二:熟悉 TCP/IP 协议
  6. 软考信息安全工程师学习笔记四(1.4 信息安全标准化知识)
  7. Docker 1.0对OpenStack意味着什么
  8. html中的a标签、img标签、iframe标签、列表标签
  9. n分频器 verilog_verilog 语言实现任意分频
  10. [网络诈骗]奈几利亚(奈及利亚), E-Mail 骗术
  11. C3AE: Exploring the Limits of Compact Model for Age Estimation
  12. 关于error LNK2005: char * xxx (?xx@@3PADA) already defined in xxx
  13. 第四章第十节数据资产盘点-形成数据资产目录
  14. SQLException错误码
  15. cent os运维知识
  16. C++简易计算器的实现
  17. 荣耀30sr升级鸿蒙,荣耀30和V30系列将首批搭载Magic UI 4.0,后续支持升级为鸿蒙系统...
  18. NO.25-SAP S4 HANA Cloud EX版本介绍
  19. 如何通过浏览器访问家里电脑
  20. 华为硬件配置命令,很全

热门文章

  1. JS方式实现隐藏手机号码中间4位数
  2. 2017 ACM Arabella Collegiate Programming Contest(solved 9/13, complex 12/13)
  3. 如何设计一个风控实验?以度小满风控实验平台架构设计为例
  4. AI TIME PhD实验室专场,四月隆重登场!
  5. GitBook 使用教程
  6. python将图片转成灰度图
  7. 玩客云刷甜糖(2022-7-26亲测)
  8. AI顶级期刊 IEEE T-PAMI 2020最新论文解读 | Deep Partial Multi-View Learning
  9. docker启动Tomcat卡住不动
  10. Python生成正则测试数据