DelayQueue demo详解

参考

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)); // 每个任务可以自行设置延迟时间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值