Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初识队列

初识队列

原创
作者头像
kwan的解忧杂货铺
发布于 2024-08-05 15:06:20
发布于 2024-08-05 15:06:20
1030
举报
文章被收录于专栏:基础基础

1.ArrayDeque 类

特点:

  • 由数组组成的双端队列。
  • 没有容量限制,根据需要扩容。
  • 不是线程安全的。
  • 禁止插入 null 元素。
  • 当用作栈时,比栈速度快,当用作队列时,速度比 LinkList 快。
  • 大部分方法的算法时间复杂度为 O(1)。
  • remove、removeFirstOccurrence、removeLastOccurrence、contains、remove 和批量操作的算法时间复杂度 O(n)

使用:

代码语言:java
AI代码解释
复制
ArrayDeque arrayDeque = new ArrayDeque();
for (int i = 0; i < 50; i++) {
    arrayDeque.add(buildingBlock); // add方法等价于addLast方法
}

2.LinkedTransferQueue 类

LinkedTransferQueue原理:

LinkedTransferQueue = 阻塞队列+链表结构+TransferQueue

之前我们讲“使命必达 TransferQueue 接口时已经介绍过了 TransferQueue 接口 ,所以 LinkedTransferQueue 接口跟它相似,只是加入了阻塞插入和移除的功能,以及结构是链表结构。

之前的 TransferQueue 也讲到了 3 个案例来说明 TransferQueue 的原理,大家可以回看 TransferQueue。

LinkedTransferQueue接口比其他阻塞队列多了5个方法:

  • transfer(E e)
  • tryTransfer(E e)
  • tryTransfer(E e, long timeout, TimeUnit unit)
  • getWaitingConsumerCount()
  • hasWaitingConsumer()

LinkedTransferQueue实现了哪些接口:

  • LinkedBlockingDeque 继承了 BlockingQeque 类,可作为阻塞队列使用
  • LinkedBlockingDeque 继承了 AbstractQueue 抽象类,具有队列的功能

3.SynchronousQueue 类

SynchronousQueue原理:

  • 我称 SynchronousQueue 为”传球好手“。想象一下这个场景:小明抱着一个篮球想传给小花,如果小花没有将球拿走,则小明是不能再拿其他球的。
  • SynchronousQueue 负责把生产者产生的数据传递给消费者线程。
  • SynchronousQueue 本身不存储数据,调用了 put 方法后,队列里面也是空的。
  • 每一个 put 操作必须等待一个 take 操作完成,否则不能添加元素。
  • 适合传递性场景。
  • 性能高于 ArrayBlockingQueue 和 LinkedBlockingQueue。

SynchronousQueue应用场景:

  • 吞吐量通常要高于 LinkedBlockingQueue。创建线程池时,参数 runnableTaskQueue(任务队列),用于保存等待执行的任务的阻塞队列可以选择 SynchronousQueue。静态工厂方法 Executors.newCachedThreadPool()使用了这个队列

SynchronousQueue和LinkedTransferQueue的区别:

  • SynchronousQueue 不存储元素,而 LinkedTransferQueue 存储元素。
  • SynchronousQueue 队列里面没有元素,而 LinkedTransferQueue 可以有多个存储在队列等待传输。
  • LinkedTransferQueue 还支持若传输不了,则丢到队列里面去。
  • LinkedTransferQueue 还支持若超过一定时间传输不了,则丢到队列里面去。

4.DelayQueue 类

DelayQueue原理:

  • DelayQueue = Delayed + BlockingQueue。队列中的元素必须实现 Delayed 接口。
  • 在创建元素时,可以指定多久可以从队列中获取到当前元素。只有在延时期满才能从队列中获取到当前元素。
代码语言:java
AI代码解释
复制
public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
    implements BlockingQueue<E> {

源码解析:

  • 添加元素时,指定延时多久可以从队列中获取元素
代码语言:java
AI代码解释
复制
public boolean offer(E e, long timeout, TimeUnit unit) {
    return offer(e);
}
  • 获取元素的方法 poll 需要等待延时时间过了才能获取到元素
代码语言:java
AI代码解释
复制
if (first == null || first.getDelay(NANOSECONDS) > 0)
    return null;
else
    return q.poll();

应用场景:

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

DelayQueue实现了哪些接口:

  • DelayQueue 实现了 BlockingQueue 接口,可作为阻塞队列使用

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
干货 | 45张图庖丁解牛18种Queue,你知道几种?
在讲《21张图讲解集合的线程不安全》那一篇,我留了一个彩蛋,就是Queue(队列)还没有讲,这次我们重点来看看Java中的Queue家族,总共涉及到18种Queue。这篇恐怕是市面上最全最细 讲解Queue的。
悟空聊架构
2020/09/10
5580
(76) 并发容器 - 各种队列 / 计算机程序的思维逻辑
本节,我们来探讨Java并发包中的各种队列。Java并发包提供了丰富的队列类,可以简单分为: 无锁非阻塞并发队列:ConcurrentLinkedQueue和ConcurrentLinkedDeque 普通阻塞队列:基于数组的ArrayBlockingQueue,基于链表的LinkedBlockingQueue和LinkedBlockingDeque 优先级阻塞队列:PriorityBlockingQueue 延时阻塞队列:DelayQueue 其他阻塞队列:SynchronousQueue和LinkedT
swiftma
2018/01/31
6260
并发编程5:Java 阻塞队列源码分析(下)
该文章介绍了如何通过Java代码实现一个简单的阻塞队列,包括基于ReentrantLock的公平锁、基于Condition的等待/通知机制、基于优先级的阻塞队列、基于自定义类的阻塞队列以及基于LockSupport的线程中断等知识点。同时,文章还介绍了如何使用Java并发包中的阻塞队列类来实现任务的执行和调度,以及如何使用自定义类实现一个基于优先级的阻塞队列。通过这些技术,可以实现更加高效和公平的并发调度,从而提高程序的运行效率和可靠性。
张拭心 shixinzhang
2018/01/05
1.1K0
并发编程5:Java 阻塞队列源码分析(下)
JUC学习笔记(三)—同步阻塞队列
BlockingQueue 阻塞队列接口继承自Queue接口,BlockingQueue接口提供了3个添加元素方法:
Monica2333
2020/06/19
5820
多线程编程学习六(Java 中的阻塞队列).
阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满;当队列空时,队列会阻塞获得元素的线程,直到队列变非空。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。
JMCui
2021/12/24
5890
多线程编程学习六(Java 中的阻塞队列).
java中的阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。
earthchen
2020/09/24
9730
Java并发编程(六)阻塞队列
前言 在 Android多线程(一)线程池这篇文章时,当我们要创建ThreadPoolExecutor的时候需要传进来一个类型为BlockingQueue的参数,它就是阻塞队列,在这一篇文章里我们会介绍阻塞队列的定义、种类、实现原理以及应用。 1.什么是阻塞队列 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 BlockingQueue有两个常见阻塞场景 当队列中没有数据的情况下,消费者端的所有
用户1269200
2018/02/01
2K0
Java并发编程(六)阻塞队列
java高并发系列 - 第25天:掌握JUC中的阻塞队列
(2)如果操作失败,则返回特殊值(null或false,具体取决于操作),接口的常规结构如下表所示。
路人甲Java
2019/12/10
4830
10分钟从实现和使用场景聊聊并发包下的阻塞队列
上篇文章12分钟从Executor自顶向下彻底搞懂线程池中我们聊到线程池,而线程池中包含阻塞队列
菜菜的后端私房菜
2024/07/03
3810
并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法.
小小工匠
2021/08/17
3330
10分钟搞定 Java 并发队列好吗?好的
| 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand i
用户4172423
2020/08/31
6280
10分钟搞定 Java 并发队列好吗?好的
阻塞队列BlockingQueue及实现原理分析
BlockingQueue 对插入操作、移除操作、获取元素操作提供了四种不同的方法用于不同的场景中使用:
烂猪皮
2023/09/04
5470
阻塞队列BlockingQueue及实现原理分析
突击并发编程JUC系列-阻塞队列 BlockingQueue
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。
山间木匠
2020/10/23
6460
突击并发编程JUC系列-阻塞队列 BlockingQueue
Java 7 种阻塞队列详解
队列(Queue)是一种经常使用的集合。Queue 实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。和 List、Set 一样都继承自 Collection。它和 List 的区别在于,List可以在任意位置添加和删除元素,而Queue 只有两个操作:
海星
2020/09/27
9.7K0
Android多线程编程__阻塞队列
我们可以看到,ArrayBockingQueue 维护了一个 Object 类型的数组,takeIndex 和 putIndex 分别表示队首元素和队尾元素的下标,count表示队列中元素的个数,接着往下看
Petterp
2022/02/09
1.1K0
Android多线程编程__阻塞队列
解读Java阻塞队列BlockingQueue的实现
上篇文章我们介绍了队列的基类接口Queue它定义了所有实现队列的类必须拥有的方法行为而BlockingQueue阻塞队列接口继承了Queue接口,此外BlockingQueue队列接口是Java并发包里面所有实现线程安全队列的基类接口。
我是攻城师
2018/09/30
5.8K0
解读Java阻塞队列BlockingQueue的实现
解读 Java 并发队列 BlockingQueue
转自:https://javadoop.com/post/java-concurrent-queue
Java技术江湖
2019/09/25
6370
Java中的BlockingQueue1 Java中的阻塞队列2 生产者和消费者例子2 Java里的阻塞队列
1 Java中的阻塞队列 1.1 简介 一种支持两个附加操作的队列,是一系列阻塞队列类的接口 当存取条件不满足时,阻塞在操作处 队列满时,阻塞存储元素的线程,直到队列可用 队列空时,获取元素的线程会
JavaEdge
2018/05/16
1.7K0
Java核心知识点整理大全9-笔记
4.1.14.5. PriorityBlockingQueue(compareTo 排序实现优先)
用户10920956
2024/01/18
1340
Java核心知识点整理大全9-笔记
高并发之并发容器,了解多少(从入门到超神)
在上面已经提到过ConcurrentHashMap,ConcurrentHashMap相比Hashtable能够进一步提高并发性,其原理图如下:
好好学java
2018/10/18
6240
推荐阅读
相关推荐
干货 | 45张图庖丁解牛18种Queue,你知道几种?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档