首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

DelayQueue详解

DelayQueue介绍   【1】DelayQueue 是一个支持延时获取元素阻塞队列, 内部采用优先队列 PriorityQueue 存储元素,同时元素必须实现 Delayed 接口;在创建元素时可以指定多久才可以从队列获取当前元素...,只有在延迟期满时才能从队列中提取元素。...private final PriorityQueue q = new PriorityQueue(); // 用于标记当前是否有线程在排队(仅用于取元素时) leader 指向是第一个从队列获取元素阻塞线程...() == e) { // 若入队元素位于队列头部,说明当前元素延迟最小,将 leader 置空 //为什么要置空,要结合take方法,leader有值说明它之前获得了头节点...();// 取出堆顶元素( 最早过期元素,但是弹出对象) if (first == null)// 如果堆顶元素为空,说明队列还没有元素,直接阻塞等待

53020
您找到你想要的搜索结果了吗?
是的
没有找到

死磕Java并发:J.U.C之阻塞队列:DelayQueue

里面的元素全部都是“可延期”元素,列头元素是最先“到期”元素,如果队列里面没有元素到期,是不能从列头获取元素,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列元素。...同时也可以从这里初步理清楚DelayQueue内部实现机制了:以支持优先级无界队列PriorityQueue作为一个容器,容器里面的元素都应该实现Delayed接口,在每次往优先级队列添加元素时以元素过期时间作为排序条件...插入元素 q.offer(e); // 如果当前元素对首元素(优先级最高),leader设置为空,唤醒所有等待线程 if (q.peek...first = null 这里为什么如果设置first = null,则会引起内存泄漏呢?线程A到达,列首元素没有到期,设置leader = 线程A,这是线程B来了因为leader !...这样会无限期不能回收,就会造成内存泄漏。 这个入队、出对过程和其他阻塞队列没有很大区别,无非是在出对时候增加了一个到期时间判断。同时通过leader来减少不必要阻塞。 - END -

24510

【死磕Java并发】-----J.U.C之阻塞队列:DelayQueue

DelayQueue是一个支持延时获取元素无界阻塞队列。里面的元素全部都是“可延期”元素,列头元素是最先“到期”元素,如果队列里面没有元素到期,是不能从列头获取元素,哪怕有元素也不行。...也就是说只有在延迟期到时才能够从队列元素。...同时也可以从这里初步理清楚DelayQueue内部实现机制了:以支持优先级无界队列PriorityQueue作为一个容器,容器里面的元素都应该实现Delayed接口,在每次往优先级队列添加元素时以元素过期时间作为排序条件...插入元素 q.offer(e); // 如果当前元素对首元素(优先级最高),leader设置为空,唤醒所有等待线程 if (q.peek...first = null 这里为什么如果设置first = null,则会引起内存泄漏呢?线程A到达,列首元素没有到期,设置leader = 线程A,这是线程B来了因为leader !

77480

每日一博 - DelayQueue阻塞队列源码解读

在创建元素时,可以指定多久才能从队列获取当前元素。只有延时期满后才能从队列获取元素。...lock.newCondition(); ---- 构造函数 DelayQueue 内部组合PriorityQueue,对元素操作都是通过PriorityQueue 来实现,DelayQueue...构造方法很简单,对于PriorityQueue 都是使用默认参数,不能通过DelayQueue 来指定PriorityQueue初始大小,也不能使用指定Comparator,元素本身就需要实现...PriorityQueue 来将元素入队 q.offer(e); //peek 是获取队头元素,唤醒阻塞在available 条件上一个线程,表示可以从队列取数据了...); DelayQueue 通过一个可重入锁来控制元素入队出队行为; DelayQueue leader 标识 用于减少线程竞争,表示当前有其它线程正在获取队头元素PriorityQueue

39230

数据结构 | Java 队列 —— Queue 详细分析

Queue实现 1)没有实现阻塞接口LinkedList: 实现了java.util.Queue接口和java.util.AbstractQueue接口   内置阻塞队列: PriorityQueue...加入到 Queue 元素根据它们天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数 java.util.Comparator 实现来定位。   ...它实质上就是一种带有一点扭曲 FIFO 数据结构。不是立即从队列添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。...当然,在多线程程序,队列在任何时间都可能变成满或空,所以你可能想使用offer、poll、peek方法。这些方法在无法完成任务时 只是给出一个出错示而不会抛出异常。...另外,往入该队列元 素要具有比较能力。 DelayQueue(基于PriorityQueue来实现)是一个存放Delayed 元素无界阻塞队列,只有在延迟期满时才能从中提取元素

1.2K00

啊这,一道找中位数算法题把东哥整不会了…

尝试分析 一个直接解法可以用一个数组记录所有addNum添加进来数字,通过插入排序逻辑保证数组元素有序,当调用findMedian方法时,可以通过数组索引直接计算中位数。...第二,TreeSet并没有实现一个通过排名快速计算元素 API。假设想找到TreeSet第 5 大元素,并没有一个现成可用方法实现这个需求。...好像也不太行,因为优先级队列是一种受限数据结构,只能从堆顶添加/删除元素,我们addNum方法可以从堆顶插入元素,但是findMedian函数需要从数据中间取,这个功能优先级队列是没办法提供。...为什么呢,稍加思考可以想明白,假设我们准备向large插入元素: 如果插入num小于small堆顶元素,那么num就会留在small堆里,为了保证两个堆元素数量之差不大于 1,作为交换,把small...反之,向small插入元素是一个道理,这样就巧妙地保证了large堆整体大于small堆,且两个堆元素之差超过 1,那么中位数就可以通过两个堆堆顶元素快速计算了。

96810

java.util.concurrent 包笔记 --- BlockingQueue

ArrayBlockingQueue 内部以 FIFO(先进先出)顺序对元素进行存储。队列元素在所有元素之中是放入时间最久那个,而尾元素则是最短那个。...(2) DelayQueue用于放置实现了Delayed接口对象,其中对象只能在其到期时才能从队列取走。这种队列是有序,即队头对象延迟到期时间最段。...添加元素方法比较简单,具体实现特性功能获得元素方法代码如下 private final Condition available = lock.newCondition(); public E take...(5) SynchronousQueue是一个特殊队列,它内部同时只能够容纳单个元素。如果该队列已有一元素的话,试图向队列插入一个新元素线程将会阻塞,直到另一个线程将该元素从队列抽走。...同样,如果该队列为空,试图向队列抽取一个元素线程将会阻塞,直到另一个线程向队列插入了一条新元素

36120

Java Review - PriorityQueue源码解读

元素大小评判可以通过元素本身自然顺序(natural ordering),也可以通过构造时传入比较器 ---- PriorityQueue 继承关系 ---- PriorityQueue通过用数组表示小顶堆实现...PriorityQueue实现了Queue接口,不允许放入null元素; 其通过堆实现,具体说是通过完全二叉树(complete binary tree)实现小顶堆(任意一个非叶子节点权值...这也就是为什么可以直接用数组来存储堆原因。...E) queue[0];//0下标处那个元素就是最小那个 } element()和peek()语义完全相同,都是获取但不删除队首元素,也就是队列权值最小那个元素,二者唯一区别是当方法失败时前者抛出异常...删除是最后一个元素。直接删除即可,不需要调整。2. 删除不是最后一个元素,从删除点开始以最后一个元素为参照调用一次siftDown()即可.

26350

PriorityQueue用法和底层实现原理

大家好,又见面了,是你们朋友全栈君。 先讲使用,再讲原理 队列是遵循先进先出(First-In-First-Out)模式,但有时需要在队列基于优先级处理对象。...PriorityQueue是基于优先堆一个无界队列,这个优先队列元素可以默认自然排序或者通过提供Comparator(比较器)在队列实例化时排序。...通过二叉小顶堆实现,可以用一棵完全二叉树表示(任意一个非叶子节点权值,都不大于其左右子节点权值),也就意味着可以通过数组来作为PriorityQueue底层实现。...这也就是为什么可以直接用数组来存储堆原因。...element()和peek() element()和peek()语义完全相同,都是获取但不删除队首元素,也就是队列权值最小那个元素,二者唯一区别是当方法失败时前者抛出异常,后者返回null。

1.2K20

JUC学习笔记(三)—同步阻塞队列

异常 offer:添加元素到队列里,添加成功返回true,添加失败返回false put:添加元素到队列里,如果容量满了会阻塞直到容量不满 3个删除方法: poll:删除队列头部元素,如果队列为空,返回...否则返回元素。 remove:基于对象找到对应元素,并删除。...删除成功返回true,否则返回false take:删除队列头部元素,如果队列为空,一直阻塞到队列有元素删除 常用阻塞队列具体类有ArrayBlockingQueue、LinkedBlockingQueue...列头元素是最先“到期”元素,如果队列里面没有元素到期,是不能从列头获取元素,哪怕有元素也不行。也就是说只有在延迟期满时才能够从队列中去元素。...例如clear是执行任何操作,contains始终返回false,peek始终返回null。

51520

Java中队列(Queue)用法

解释FIFO原则 FIFO原则是队列操作核心。在队列元素能从队尾(rear)添加,从队头(front)移除。这种操作方式确保了先进入队列元素先被取出。...队列基本操作 队列基本操作通常包括: Enqueue: 添加一个元素到队列尾部。 Dequeue: 移除并返回队列头部元素Peek: 返回队列头部元素但不移除它。...E peek(): 返回队列头部元素但不移除它,如果没有元素则返回null。...PriorityQueue PriorityQueue是一个不允许null元素队列,它按照自然排序顺序或者根据提供Comparator来决定元素顺序。...LinkedList:适合需要频繁插入和删除场景,但可能在队列操作不如ArrayDeque高效。 PriorityQueue:适合需要根据优先级来访问元素场景。

13410

详解 18 种队列,你知道几种?

,无论现实生活还是计算机世界都是一个很重要角色哦~ 是一种数据结构,大家可以把想象成一个数组,元素一头进入、从另外一头出去,称为FIFO原则(先进先出原则)。...(3)同理,检测(Examine)元素动作,返回头部元素(最开始加入元素),但不删除元素, 如果队列为空,则element()方法抛异常,而peek()返回false。...peek方法用于检测头部元素存在性,如果队列为空,返回特殊值null,否则返回头部元素。 6.4 BlockingQueue通过什么来阻塞插入和移除?...只有在延时期满才能从队列获取到当前元素。...然后用一个线程循环查询DelayQueue队列,一旦能从DelayQueue获取元素时,表示缓存有效期到了。

85331

干货 | 45张图庖丁解牛18种Queue,你知道几种?

1.1 Queue自我介绍 hi,大家好,英文名叫Queue,中文名叫队列,无论现实生活还是计算机世界都是一个很重要角色哦~ 是一种数据结构,大家可以把想象成一个数组,元素一头进入...(3)同理,检测(Examine)元素动作,返回头部元素(最开始加入元素),但不删除元素, 如果队列为空,则element()方法抛异常,而peek()返回false。...peek方法用于检测头部元素存在性,如果队列为空,返回特殊值null,否则返回头部元素。 6.4 BlockingQueue通过什么来阻塞插入和移除?...只有在延时期满才能从队列获取到当前元素。...然后用一个线程循环查询DelayQueue队列,一旦能从DelayQueue获取元素时,表示缓存有效期到了。

48841

Java精讲 | 45张图庖丁解牛18种Queue,你知道几种?

,无论现实生活还是计算机世界都是一个很重要角色哦~ 是一种数据结构,大家可以把想象成一个数组,元素一头进入、从另外一头出去,称为FIFO原则(先进先出原则)。...(3)同理,检测(Examine)元素动作,返回头部元素(最开始加入元素),但不删除元素, 如果队列为空,则element()方法抛异常,而peek()返回false。...peek方法用于检测头部元素存在性,如果队列为空,返回特殊值null,否则返回头部元素。 6.4 BlockingQueue通过什么来阻塞插入和移除?...只有在延时期满才能从队列获取到当前元素。...然后用一个线程循环查询DelayQueue队列,一旦能从DelayQueue获取元素时,表示缓存有效期到了。

71330

并发编程之queue

在队列这种数据结构,最先插入元素将是最先被删除元素;反之最后插入元素将是最后被删除元素,因此队列又称为“先进先出”(FIFO—first in first out)线性表。...加入到 Queue 元素根据它们天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数 java.util.Comparator 实现来定位。   ...它实质上就是一种带有一点扭曲 FIFO 数据结构。不是立即从队列添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。...LinkedBlockingQueue实现队列可以指定队列大小,默认是Integer.MAX_VALUE。...来实现)是一个存放Delayed 元素无界阻塞队列,只有在延迟期满时才能从中提取元素

77370

算法原理系列:优先队列

好了,开始构建优先队列结构吧,现假定给你一堆数: nums = [78, 82, 75, 35, 71, 23, 41, 42, 58, 8] 目标: 每次输出最小值,并从nums删除元素,直到...代码如下: /** * * @author DemonSong * * 实现基于插入排序优先队列 * * 插入元素 O(n) * 删除元素 O(n) * * @param...在这里,我们可以得到一个有趣猜想,一种数据结构出现结果越“唯一”,维护该结构所需要消耗越小。...同样,已知子结点k,父结点为k/2。 为什么插入是从数组尾部开始? 答:也想从头部开始插啊,但头部开插,要写个随机算法来随机选择某个子结点?而且即使实现了,你这叶子结点生长性也太随机了吧?...随机结果必然导致父子结点k求法失效。 尾插好处是什么? 答:每次都是严格扩展完全二叉堆,这还不够好么?所以刚才是沉降操作,反过来自然有了上浮操作。 删除了头元素该怎么办?

44230
领券