『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.符合我们上面预设的时间差 。
推荐阅读
- 『Java』java数据结构系列——什么是数据结构
- 『Java』马云:成功人跟普通人差不多,但这三点我一定要分享给所有年轻人
- #Java#java线程到底有多少种状态?
- #智能手表#1、初识java-1
- [华为]有朋友问我“JAVA全栈”、“互联网架构师”和“JAVAEE”到底是什么?
- 『安卓』不管用的什么安卓机,开启这几个功能,能让你的手机再战三年
- 「javascript」这边走Javascript了解一下
- 手机大魔王闭着眼睛买都不会错丨母亲节选购特辑,给妈妈用的六款手机推荐
- 华为手机@如果你用的是华为手机,请关掉这6个设置,手机立马流畅3倍
- 叶紫网不怕摔不怕坏,特别适合老年人用的三防手机