博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
看看DelayQueue源码
阅读量:5807 次
发布时间:2019-06-18

本文共 907 字,大约阅读时间需要 3 分钟。

hot3.png

f691cdd7fa6831afb089637beddc58ca1b2.jpg

这里可以看到DelayQueue类的层次结构。这是一个Delayed元素的无界阻塞队列,其中只有在延迟过期时才能获取元素。队列的头部的元素是根据继承的接口方法compareTo比较最小的。当元素的getDelay(TimeUnit.NANOSECONDS)方法返回小于或等于零的值时,会发生到期。即使使用take或poll无法删除未到期的元素,例如,size方法返回已过期和未过期元素的计数。

此队列不允许null元素。

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

Delayed的结构,继承Comparable接口,并增加了 long getDelay(TimeUnit unit)方法,这个方法返回到激活日期的剩余时间,时间单位由单位参数指定。

2f86f6f0b3d85ec2786f686842defc2bd21.jpg

该接口强制执行下列两个方法。

  • CompareTo(Delayed o):Delayed接口继承了Comparable接口,因此有了这个方法。
  • getDelay(TimeUnit unit):这个方法返回到激活日期的剩余时间,时间单位由单位参数指定。

对这个类不是很熟悉,我们来写个demo,写个Message实现Delayed接口

6e1548cfb9362532328638ac80b419127d0.jpg

然后写一个DelayQueue来实现想要的功能

0997a19ce669577ff8f8629379ab599d3d3.jpg

输出:

7262284fb66e7233853e17a85a766a23aeb.jpg

该类有两个构造方法

d416a84b3e7f20a5cfc25f2d4d541176634.jpg

带参数的那个实际上执行的是offer方法,具体的实现还是PriorityQueue的

c1b20036f4171651b5cb1b1876444a9cfd7.jpg

这里获取值的时候用了take方法,检索并删除此队列的头部,必要时等待,直到此队列上有一个具有过期延迟的元素。这里用了ReentrantLock和Condition控制。

200ee2122381f9dd134e843162fa2e361a4.jpg

这里用的poll的方法也是很有趣的,检索并删除此队列的头部,如果此队列没有具有过期延迟的元素,则返回null。

74f23df404722009475b05cd34482884d54.jpg

参考:https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/DelayQueue.html

223108_3TsV_2277632.png

转载于:https://my.oschina.net/u/2277632/blog/2255846

你可能感兴趣的文章
USNews大学排名遭美国计算机研究学会怒怼,指排名荒谬要求撤回
查看>>
struts1——静态ActionForm与动态ActionForm
查看>>
七大关键数据 移动安全迎来历史转折点
查看>>
各大电商纷纷瞄准机器人领域,备战双十一各显神功
查看>>
在AngularJS中学习javascript的new function意义及this作用域的生成过程
查看>>
盘点物联网网关现有联网技术及应用场景
查看>>
Windwos 08R2_DNS全面图文详解
查看>>
重拾黑客精神:后IT时代技术流的回归
查看>>
网络钓鱼大讲堂 Part3 | 网络钓鱼攻击向量介绍
查看>>
阿里云与Intel联合发布加密计算,亚洲首个云上“芯片级”数据保护
查看>>
js实现按钮复制功能
查看>>
1、下载安装scala编译器(可以理解为scala的jdk),地址:http://www.scala
查看>>
mui 总结2--新建第一个app项目
查看>>
nginx的lua api
查看>>
考研太苦逼没坚持下来!看苑老师视频有点上头
查看>>
【安全牛学习笔记】提权
查看>>
HCNA——RIP的路由汇总
查看>>
关于Java的线程状态
查看>>
终于找到一个方法可以使用EF的时候动态指定数据库路径了
查看>>
PHP 代码加密
查看>>