DelayQueue

DelayQueue是一个无界阻塞队列,可以用做延时处理,所谓延时处理就是说可以为队列中元素设定一个过期时间,其中的元素只有在时间到期时才能从中被提取。该队列的头部是延迟期满后保存时间最长的Delayed 元素。存放到DelayDeque的元素必须继承Delayed接口。Delayed接口使对象成为延迟对象,它使存放在DelayQueue类中的对象具有了激活日期。该接口强制实现下列两个方法。

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

简单使用

实现一个延迟任务

public class DelayedTask implements Delayed{

/**
 * 延迟时间
 */
private final long delayTime;
/**
 * 到期时间
 */
private final long expire;
/**
 *  数据
 */
private String data;

public DelayedTask(long delayTime,String data){
    this.delayTime=delayTime;
    this.data=data;
    // 过期时间为:当前系统时间+延迟时间
    this.expire=System.currentTimeMillis()+delayTime;
}

@Override
public long getDelay(@NotNull TimeUnit unit) {
    return unit.convert(this.expire - System.currentTimeMillis() , TimeUnit.MILLISECONDS);
}

@Override
public int compareTo(@NotNull Delayed o) {
    return (int) (this.getDelay(TimeUnit.MILLISECONDS) -o.getDelay(TimeUnit.MILLISECONDS));
}

@Override
public String toString() {
    final StringBuilder sb = new StringBuilder("DelayedElement{");
    sb.append("delay=").append(delayTime);
    sb.append(", expire=").append(expire);
    sb.append(", data='").append(data).append('\'');
    sb.append('}');
    return sb.toString();
}

}

使用延迟队列

public class DelayedQueueStudy {
public static void main(String[] args){

DelayQueue delayQueue =new DelayQueue<DelayedTask>();
DelayedTask delayedTask=new DelayedTask(5000,"abc");
DelayedTask delayedTask1=new DelayedTask(3000,"def");
delayQueue.offer(delayedTask);
delayQueue.offer(delayedTask1);
long startTime=System.currentTimeMillis();
while (true){
    try {
        Delayed delayedtask=delayQueue.take();
        System.out.println(delayedtask);
        long endTime=System.currentTimeMillis();
        System.out.println("用时总时间"+(endTime-startTime));
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
} 

}
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获...
    jiangmo阅读 5,630评论 0 3
  • DelayQueue是一个支持延时获取元素的无界阻塞队列。队列中的元素必须实现Delayed接口,在创建元素的时候...
    会跳舞的机器人阅读 4,866评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,798评论 19 139
  • 明天就要出行了,去一个从来没有去过的城市“广州”,陌生又期待的城市。广州是我离家最远的一次出行,行程六天,刚...
    桔子pi阅读 3,146评论 0 0
  • 第一类----不可思议 当一直把他当作哥哥的人突然说喜欢你,你的反应又会怎么样,会答应吗...
    亦梦亦夏阅读 1,527评论 0 0