参考
https://www.cnblogs.com/myseries/p/10944211.html
主要用于以下业务:
1. 淘宝订单业务:下单之后如果三十分钟之内没有付款就自动取消订单。
2. 饿了吗订餐通知:下单成功后60s之后给用户发送短信通知。(即等待多久之后才能取出元素,适用于取出之前要完成各种准备工作的对象,给其充分时间让其完成准备,然后再取出)
3.关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。
4.缓存。缓存中的对象,超过了空闲时间,需要从缓存中移出。
5.任务超时处理。在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求等。
代码
delay接口;
static class Task implements Delayed{
@Override
//比较延时,队列里元素的排序依据
public int compareTo(Delayed o) {
return 0;
}
@Override
//获取剩余时间,当为0时,才能从队列中取出
public long getDelay(TimeUnit unit) {
return 0;
}
}
常见写法:
static class Task implements Delayed{
long time = System.currentTimeMillis();
private long start = System.currentTimeMillis();
public Task(long time) {
this.time = time; // 此即为约定的取出延迟时间,对象生成之后,time之后才能从队列中取出
}
@Override // 队列中的排序依据,可知优先排延迟时间长的
public int compareTo(Delayed o) {
if(this.getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS))
return -1;
else if(this.getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS))
return 1;
else
return 0;
}
@Override // 为0时方能取出,即对象初始化完成时间 + 时间间隔 = 当前时间时,方能取出
public long getDelay(TimeUnit unit) {
return unit.convert((start+time) - System.currentTimeMillis(),TimeUnit.MILLISECONDS);
}
@Override
public String toString() {
return "" + time;
}
}
或者是:
static class Task implements Delayed{
long time = System.currentTimeMillis();
public Task(long time) {
this.time = time;
}
@Override
public int compareTo(Delayed o) {
if(this.getDelay(TimeUnit.MILLISECONDS) < o.getDelay(TimeUnit.MILLISECONDS))
return -1;
else if(this.getDelay(TimeUnit.MILLISECONDS) > o.getDelay(TimeUnit.MILLISECONDS))
return 1;
else
return 0;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(time - System.currentTimeMillis(),TimeUnit.MILLISECONDS);
}
@Override
public String toString() {
return "" + time;
}
}
task生成需要如下生成:
delayqueue.put(new Task(now+3000)); // 每个任务可以自行设置延迟时间