浅谈DelayQueue的使用

a 夏天 提交于 2019-12-04 09:08:11

首先,DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。可以设置该队列的存活时间、移除时间、唯一ID等元素。

DelayQueue阻塞队列在我们系统开发中也常常会用到,例如:延迟多久执行某操作;任务调度系统,能够准确的把握任务的执行时间。为了具有调用行为,存放到DelayDeque的元素必须继承Delayed接口。Delayed接口使对象成为延迟对象,它使存放在DelayQueue类中的对象具有了激活日期。

  • CompareTo(Delayed o):Delayed接口继承了Comparable接口,因此有了这个方法。
  • getDelay(TimeUnit unit):这个方法返回到激活日期的剩余时间,时间单位由单位参数指定。
  • new DelayedItem(T t, Long liveTime, String id)--构造函数,之后附上代码。
public class DelayEvent<T extends Runnable> implements Delayed {

    private T t;
    private Long liveTime ;
    private Long removeTime;
    private String id;
    private static final AtomicLong atomic = new AtomicLong(0);


    public DelayEvent(T t,Long liveTime, String id){
        this.setT(t);
        this.liveTime = liveTime;
        this.id = id;
        this.removeTime = removeTime ;
    }

    @Override
    public int compareTo(Delayed o) {
        if (o == null) return 1;
        if (o == this) return  0;
        if (o instanceof DelayEvent){
            DelayEvent<T> tmpDelayEvent = (DelayEvent<T>)o;
            if (removeTime > tmpDelayEvent.removeTime ) {
                return 1;
            }else if (removeTime.equals(tmpDelayEvent.removeTime)) {
                return 0;
            }else {
                return -1;
            }
        }
        long diff = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
        return diff > 0 ? 1:diff == 0? 0:-1;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(removeTime - System.nanoTime(), unit);
    }

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
    @Override
    public int hashCode(){
        return id.hashCode();
    }

    @Override
    public boolean equals(Object object){
        if (object instanceof DelayEvent) {
            DelayedItem o = (DelayEvent) object;
            return id != null && o.id != null && id.equals(o.id);
        }
        return false;
    }

    public Long getLiveTime() {
        return liveTime;
    }

    public Long getRemoveTime() {
        return removeTime;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

  操作计时队列(加入计时队列、移除计时队列等):

public interface TimeQueue<T extends Runnable> {


    /**
     * 新加入计时队列
     * @param delayedEvent
     * @return
     */
    boolean addQueue(DelayedEvent<T> delayedEvent);

    /**
     * 重新加入计时队列
     * @param delayedEvent
     * @return
     */
    boolean reAddQueue(DelayedEvent<T> delayedEvent);

    /**
     * 删除计时队列
     * @param delayedEvent
     * @return
     */
    boolean removeQueue(DelayedEvent<T> delayedEvent);

    /**
     * 是否包含
     * @param delayedEvent
     * @return
     */
    boolean contains(DelayedEvent<T> delayedEvent);

    int size();
}

  接口实现类:

@Component
public class TimeQueueImpl<T extends Runnable> implements TimeQueue<T> {

    public static final DelayQueue<DelayedEvent> timeQueue = new DelayQueue<DelayedEvent>();


    @Override
    public boolean reAddQueue(DelayedEvent<T> delayedEvent) {
        removeQueue(delayedEvent);
        return addQueue(delayedEvent);
    }

    @Override
    public boolean addQueue(DelayedEvent<T> delayedEvent) {
        boolean addFlag = timeQueue.add(delayedEvent);
        return addFlag;
    }

    @Override
    public boolean removeQueue(DelayedEvent<T> delayedEvent) {
        boolean removeFlag = timeQueue.remove(delayedEvent);
        return removeFlag;
    }

    @Override
    public boolean contains(DelayedEvent<T> delayedEvent) {
        return timeQueue.contains(delayedItem);
    }

    @Override
    public int size() {
        return timeQueue.size();
    }
}

  操作案例代码:

timeQueue.addQueue(new DelayedEvent(new delayQueueTask("此处需要传入用到的资源"), "需要触发的时间段", "唯一队列ID"); 
// 具体执行:
public class DelayQueueTask implements Runnable {

    private AService aService;

    public DelayQueueTask(AService aService) {
        this.aService = aService;
    }

    @Override
    public void run() {
        try {
            aService.execute();
        } catch (Exception e) {
            log.error("任务处理异常:{}", "Exception==", e);
        }
    }
}

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!