『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍


『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
文章图片
『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
文章图片
『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
文章图片
『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
文章图片
『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
文章图片
『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
文章图片
『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
文章图片
『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
文章图片
『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
通过前面两篇文章 , 我们对队列有了了解及已经认识了常用阻塞队列中的三个了 。 本篇我们继续介绍剩下的几个队列 。
本文主要内容:通过源码学习Delayqueue及理解Dqueue并用代码简单演示使用场景 。
本文出自凯哥Java(kaigejava)的《凯哥Java并发系列》之《Java并发编程之队列》系列的第三篇:《Java中常用的七个阻塞队列第二篇DelayQueue源码介绍》
Java中常用的几个队列中 , 阻塞队列还有四个没介绍 。 如下图:
DelayQueue先上总结脑图:
编辑
来看看构造器:
支持无参和支持直接存放一个集合的 。
再来看看为什么说DQueue队列使用的是PriorityQueue实现的呢?来看看源码:
在添加元素的offer方法源码中 , 我们可以看到最终调用的是q.offer(e)这个方法的 。 那么q又是什么呢?我们接着跟下去:private final PriorityQueue<E> q = new PriorityQueue<E>(); 。 发现q是PriorityQueue这个队列 。 如下图:
为什么说可以延时呢?我们来看看DQueyue类的定义:
public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E> {
从源码中 , 我们可以看到DQueue队列中存放的元素必须要实现Delayed接口 。
我们在来看看Delayed接口的方法:
只有 , long getDelay(TimeUnit unit);方法 。 设置等待时间 。
在从队列中获取数据的时候会对超时时间进行判断的 。 当超时时间小于等于0的时候 , 才会调用priorityQueue队列的poll()方法 。 具体源码如下:
从源码中 , 我们可以看到 , DQueue延时处理的:
无界怎么理解?说DQueue无界 , 我们应该从源码中查找 。 DQueue队列是基于PriorityQueue队列来实现的 。 那么我们就来看看PriorityQueue队列添加元素的源码 。
从上图中 , 我们可以看到 , 在添加元素的时候offer方法会进行判断 , 当i的值大于等于队列的长的时候 , 会调用grow()方法来进行扩容 。 在grow方法中 , 我们可以看到会使用Arrsys.copyof()方法复制一份给队列 。 这样队列就完成了库容 。 没有大小的限制 。 所以说是无界的 。


推荐阅读