延时任务实现方式之队列

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38336658/article/details/81624798

延时任务:可以使用DelayQueue队列来进行实现

写一个类实现Delayed这个接口,然后复写里面的2个方法

/*
    * 获取延时时间
    */

    @Override
    public long getDelay(TimeUnit unit) {
        return endtime-System.currentTimeMillis();
    }

getDelay是获取延迟的时间,按ms算的,也就是设置延时多久执行的时间,至于endtime看下面完整的代码

@Override
    public int compareTo(Delayed o) {
        MYDelayed s = (MYDelayed)o;
        if (this.endtime > s.endtime) {
            return 1;
        }else if (this.endtime == s.endtime) {
            return 0;
        }else {
            return -1;
        }
    }

这个是比较队列里面先后顺序,比它晚玩完的返回1,一样的为0,慢的是-1

 

有几个注意的:

1.DelayQueue这个队列,take()方法会阻塞,如果你拿不到对象的话。poll()方法不会阻塞,你拿不到就是null

2.

System.currentTimeMillis()这个是按ms来算的,那么如何秒转ms,看下面,坑了我很久
TimeUnit.MILLISECONDS.convert(endtime, TimeUnit.SECONDS)

 

完整的代码:

package com.example.demo;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
import java.util.UUID;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class MYDelayed implements Delayed{

    //任务超时时间戳
    private long endtime;
    //物品id

    public String getPid() {
        return pid;
    }

    private String pid;

    /*
    * 获取延时时间
    */

    @Override
    public long getDelay(TimeUnit unit) {
        return endtime-System.currentTimeMillis();
    }

    @Override
    public int compareTo(Delayed o) {
        MYDelayed s = (MYDelayed)o;
        if (this.endtime > s.endtime) {
            return 1;
        }else if (this.endtime == s.endtime) {
            return 0;
        }else {
            return -1;
        }
    }

    MYDelayed(long endtime,String pid){
        this.endtime=System.currentTimeMillis()+TimeUnit.MILLISECONDS.convert(endtime, TimeUnit.SECONDS);
        System.out.println(this.endtime);
        this.pid=pid;
    }

    public static void main(String[] args) {
        DelayQueue<MYDelayed> delayedDelayQueue;
        delayedDelayQueue=new DelayQueue<MYDelayed>();

           new Thread(new Runnable() {
               @Override
               public void run() {
                   for (int i = 0; i < 6; i++) {
                       MYDelayed myDelayed = new MYDelayed(5, "1000"+i);
                       delayedDelayQueue.add(myDelayed);
                       System.out.println(LocalTime.now() + "插入" +myDelayed.getPid());
                       try {
                           Thread.sleep(200);
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }
               }
           }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    MYDelayed myDelayed1=null;
                    try {
                        myDelayed1=delayedDelayQueue.take();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if(myDelayed1!=null){
                        System.out.println(LocalTime.now()+"收到:"+myDelayed1.getPid());
                    }else {
                        try {
                            System.out.println("尝试获取中。。。");
                            Thread.sleep(100);
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                }
            }
            }).start();


    }
}

 

 

展开阅读全文

没有更多推荐了,返回首页