文章目录
java定时任务的另一种实现—延时队列(DelayQueue)
一、DelayQueue介绍
类签名:
public class DelayQueue<E extends Delayed> extends AbstractQueue<E> implements BlockingQueue<E>
使用场景:
在我们的业务系统中,一般会有“再多久后…就怎样”的业务,比如,一个订单在15分钟后未被支付,则需要被释放。为了完成此类业务,比较常见的实现方式为定时任务扫描:每分钟扫描一次“15分钟未付款”的订单。现在我们有了新的实现方式,那就是延迟队列—DelayQueue。
从签名“<E extends Delayed>”可知,DelayQueue容器将范型“E”限定为了Delay的子类,所以DelayQueue容器的所操作的元素,必须为Delay的子类。
二、实例演示
1、定义一个Delayed子类
class DelayedElement implements Delayed {
private long mills;
public DelayedElement(Integer min) {
this.mills = System.currentTimeMillis() / 1000 + (60 * min);
}
/**
* 当方法返回小于或等于0的数值时, 元素将会被消耗
* @param unit
* @return
*/
@Override
public long getDelay(TimeUnit unit) {
return mills - (System.currentTimeMillis() / 1000);
}
/**
* DelayQueue底层是优先队列,需要实现compareTo方法,
* 用于在入列的时候与容器中的数据进行比较,以便确定元素位置。
*/
@Override
public int compareTo(Delayed o) {
return (int)(mills - ((DelayedElement)o).getMills());
}
public long getMills() {
return mills;
}
<