zoukankan      html  css  js  c++  java
  • DelayedQueue

    package com.test.t1;
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.concurrent.DelayQueue;
    import java.util.concurrent.Delayed;
    import java.util.concurrent.TimeUnit;
    /**
     * DelayedQueue是一个用来延时处理的队列,
     * 所谓延时处理就是说可以为队列中元素设定一个过期时间,
     * 相关的操作受到这个设定时间的控制。
        首先,这种队列中只能存放实现Delayed接口的对象,
        而此接口有两个需要实现的方法。最重要的就是getDelay,
        这个方法需要返回对象过期前的countdown时间。
        简单说,队列在某些方法处理前,会调用此方法来判断对象有没有超时。
        DelayedQueue本身有些类似的存取方法,按doc描述区别如下:
    
    ​存入队列:add offer put无太大区别
    
    从队列中获取:peek poll take​有较大不同使用场景
    
    peek:获取队列的head对象,但不是从队列中移除。如果队列空,就返回空
    
    poll :​获取并移出队列head对象。如果head没有超时,返回空
    
    poll w/ timeout参数 : ​获取并移出队列head对象。如果没有超时head对象,会wait当前线程知道有超时对象,或者按照超时参数设定,返回空
    
    take : ​获取并移出队列head对象。如果没有超时head对象,会wait当前线程知道有对象满足超时条件
    
    ​DelayedQueue实现保证了最快过期的对象排在head位置,也就是说它会在每次peek时候返回最快超时的对象。
     * @author lulei
     *
     */
    public class DelayedElement implements Delayed {
        private final long delay;
    
        private final long expire;
    
        public DelayedElement(long delay) {
    
            this.delay = delay;
    
            expire = Calendar.getInstance().getTimeInMillis() + delay;
    
        }
    
        @Override
    
        public long getDelay(TimeUnit unit) {
    
            return expire - Calendar.getInstance().getTimeInMillis();
    
        }
    
        @Override
    
        public int compareTo(Delayed o) {
    
            return (int) (this.delay - o.getDelay(TimeUnit.MILLISECONDS));
    
        }
    
        @Override
    
        public String toString() {
            SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return "DelayedElement is " + delay + "
    " + 
                    sf.format(Calendar.getInstance().getTime()) + "
     过期时间是"
                    + getDelay(TimeUnit.DAYS);
    
        }
        /**
         * 测试方法
         * @param args
         * @throws InterruptedException
         */
        public static void main(String[] args) throws InterruptedException {
    
            System.out.println("测试延迟队列");
    
            @SuppressWarnings("rawtypes")
            DelayQueue delayQueue = new DelayQueue();
    
            DelayedElement el1 = new DelayedElement(5000);
    
            DelayedElement el2 = new DelayedElement(3000);
    
            delayQueue.offer(el1); 
            delayQueue.offer(el2);
    
            Delayed poll = null;
            while (poll == null) {
                poll = delayQueue.poll();
                System.out.println("poll 的结果 
    " + poll);
                System.out.println("poll 的结果 
    " + delayQueue.peek());
                Thread.sleep(500);
            }
    
    }
    }
    
  • 相关阅读:
    esp32-智能语音-mp3(sdcard)
    esp32-智能语音-ADF_PATH
    esp32-智能语音-wifi
    esp32-智能语音-led驱动
    esp32-智能语音-设计硬件问题
    技小新学习
    TVS管和ESD管
    电源IC
    天线2.4G阻抗匹配设计
    AD16建立集成库
  • 原文地址:https://www.cnblogs.com/luleiitlife/p/8545005.html
Copyright © 2011-2022 走看看