在阿里面试官面前现场手撕DelayQueue源码!(上)

0 前言

延迟元素的无边界阻塞队列,在该队列中,仅当元素的延迟到期时才可以使用它.

队首是该 Delayed 元素,其延迟在过去最远过期.

如果没有延迟已经过期,就没有head, poll将返回null.

当元素的getDelay(TimeUnit.NANOSECONDS)方法返回的值小于或等于零时,就会发生过期.

即使未到期的元素无法使用take或poll删除,它们也被视为普通的元素。 例如,size方法返回过期和未过期元素的计数.

此队列不允许空元素.

该类及其迭代器实现集合和迭代器接口的所有可选方法。方法Iterator()中提供的迭代器不能保证以任何特定的顺序遍历DelayQueue中的元素.


此类是Java Collections Framework的成员.

1 继承体系

在阿里面试官面前现场手撕DelayQueue源码!(上)

该队列里的元素必须实现Delayed接口才能入队

在阿里面试官面前现场手撕DelayQueue源码!(上)

  • 混合式的接口,用于标记在给定延迟后应作用的对象。此接口的实现还必须定义一个compareTo方法,该方法提供与其getDelay方法一致的顺序.

2 属性


  • 在阿里面试官面前现场手撕DelayQueue源码!(上)
  • PriorityQueue队列里的元素会根据某些属性排列先后的顺序,这里正好可以利用Delayed接口里的getDelay的返回值来进行排序,delayQueue其实就是在每次往优先级队列中添加元素,然后以元素的delay/过期值作为排序的因素,以此来达到先过期的元素会拍在队首,每次从队列里取出来都是最先要过期的元素
  • 在阿里面试官面前现场手撕DelayQueue源码!(上)
  • 指定用于等待队首元素的线程。 Leader-Follower模式的变体用于最大程度地减少不必要的定时等待.当一个线程成为leader时,它仅等待下一个延迟过去,但是其他线程将无限期地等待.leader线程必须在从take()或poll(…)返回之前向其他线程发出信号,除非其他线程成为过渡期间的leader。.每当队首被具有更早到期时间的元素替换时,leader字段都会被重置为null来无效,并且会发出一些等待线程(但不一定是当前leader)的信号。 因此,等待线程必须准备好在等待时获得并失去leader能力.
  • 在阿里面试官面前现场手撕DelayQueue源码!(上)
  • 当更新的元素在队首变得可用或新的线程可能需要成为 leader 时,会发出条件信号
  • 在阿里面试官面前现场手撕DelayQueue源码!(上)

3 构造方法

3.1 无参

  • 创建一个新的 DelayQueue,它初始是空的
  • 在阿里面试官面前现场手撕DelayQueue源码!(上)

3.2 有参

  • 创建一个DelayQueue,初始包含Delayed实例的给定集合的元素。
  • 在阿里面试官面前现场手撕DelayQueue源码!(上)
上一篇:VIM 操作快捷键


下一篇:C# 设计时动态改变实体在PropertyGrid中显示出来的属性