【Java进阶营】Java技术专题-教你如何使用【精巧好用】的DelayQueue(延时队列)

本文详细介绍了Java中的DelayQueue,它是一个基于优先级队列的阻塞队列,适用于处理延迟任务。文章讲解了DelayQueue的工作机制,并提供了一个用于缓存的Sample代码示例,展示了如何实现延迟插入和删除。此外,还提到了延时队列在参数配置和热刷新中的应用。
摘要由CSDN通过智能技术生成

延时队列前提

定时关闭空闲连接:服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。
定时清除额外缓存:缓存中的对象,超过了空闲时间,需要从缓存中移出。
实现任务超时处理:在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求。
应用在session超时管理:网络应答通讯协议的请求超时处理。

痛点方案机制

一种比较暴力的办法就是,使用一个后台线程,遍历所有对象,挨个检查。这种笨笨的办法简单好用,但是对象数量过多时,可能存在性能问题,检查间隔时间不好设置,间隔时间过大,影响精确度,多小则存在效率问题。

而且做不到按超时的时间顺序处理。 这场景,使用DelayQueue最适合了。

DelayQueue是java.util.concurrent中提供的一个很有意思的类。很巧妙,非常棒!但是java doc和Java SE 5.0的source中都没有Sample。我最初在阅读ScheduledThreadPoolExecutor源码时,发现DelayQueue的妙用。

本文将会对DelayQueue做一个介绍,然后列举应用场景。并且提供一个Delayed接口的实现和Sample代码。

DelayQueue是一个BlockingQueue,其特化的参数是Delayed。

Delayed扩展了Comparable接口,比较的基准为延时的时间值,Delayed接口的实现类getDelay的返回值应为固定值(final)。

DelayQueue内部是使用PriorityQueue实现的。

DelayQueue = BlockingQueue + PriorityQueue + Delayed

DelayQueue的关键元素BlockingQueue、PriorityQueue、Delayed。可以这么说,DelayQueue是一个使用优先队列(PriorityQueue)实现的BlockingQueue,优先队列的比较基准值是时间。
基本定义如下

public interface Comparable {
public int compareTo(T o);
}

public interface Delayed extends Comparable {
long getDelay(TimeUnit unit);
}

public class DelayQueue implements BlockingQueue {
private final PriorityQueue q = new PriorityQueue();
}

DelayQueue内部的实现使用了一个优先队列。当调用DelayQueue的offer方法时,把Delayed对象加入到优先队列q中。如下:

public boolean offer(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
E first = q.peek();
q.offer(e);
if (first == null || e.compareTo(first) < 0)
available.signalAll();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值