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


阻塞理解当队列为空的时候 , “获取/取”元素操作将会block , 被阻塞着 。 我们来看看源码是怎么实现的 。
从源码中我们可以看到 , 当从队列中获取元素的时候 , 先判断 , 如果第一个元素为空的时候 , 就等待 。 当等待的时间小于等于延时时间的话 , 就从队列中poll了;如果leader不为空的话 , 说明当前队列不是队首元素 , 依然await 。
支持优先级因为在PQueue队列的添加方法中 , 使用了comparator.compare方法 。 源码如下图:
所以通过源码分析我们可以到得到DelayQueue如下脑图:
使用场景:DQueue非常有用的 。 我们利用DQueue的延时特性 , 可以讲DQueue应用于以下场景:
1:缓存的设计 。 可以利用Dqueue保存缓存元素的有效期 。 使用一个线程循环的从队列中获取数据 。 一旦获取到数据 , 就说明缓存有效期到了 。
2:定时任务调度 。 可以使用Dqueue保存需要执行的任务和任务执行的时间 , 一旦从DQueue中获取到了任务 , 就开始执行任务了 。 比如TimerQueue就是使用了DelayQueue来实现的 。
下面凯哥(凯哥Java:kaigejava)通过代码简单演示模拟缓存过期时间的案例 。
代码演示:需求:模拟缓存设置有效期 。
说明:当从队列中获取到元素 , 说明元素的有效期到了 。
模拟缓存的对象:
构造器:
需要注意:time=传递的time+当前时间 。
实现了Delayed接口 , 需要重写getDelay和compartTo方法 。
重写方法如下:
返回的是time与当前时间之间的差值 。
compareTo方法如下:
调用方法:
【『Java』Java中常用的七个阻塞队列第二篇DelayQueue源码介绍】来看看运行结果:
从运行结果中 , 我们可以看到 , 从打印出开始获取到k1的输出之间相差1s;K1与k2之间相差2s;K3和K2之间也相差2s.符合我们上面预设的时间差 。


推荐阅读