DelayQueue 学习

DelayQueue 学习

介绍

jdk里面的解释是:

* An unbounded {@linkplain BlockingQueue blocking queue} of
 * {@code Delayed} elements, in which an element can only be taken
 * when its delay has expired.  The <em>head</em> of the queue is that
 * {@code Delayed} element whose delay expired furthest in the
 * past.  If no delay has expired there is no head and {@code poll}
 * will return {@code null}. Expiration occurs when an element's
 * {@code getDelay(TimeUnit.NANOSECONDS)} method returns a value less
 * than or equal to zero.  Even though unexpired elements cannot be
 * removed using {@code take} or {@code poll}, they are otherwise
 * treated as normal elements. For example, the {@code size} method
 * returns the count of both expired and unexpired elements.
 * This queue does not permit null elements.
 *
 * <p>This class and its iterator implement all of the
 * <em>optional</em> methods of the {@link Collection} and {@link
 * Iterator} interfaces.  The Iterator provided in method {@link
 * #iterator()} is <em>not</em> guaranteed to traverse the elements of
 * the DelayQueue in any particular order.

大概说: delayQueue是一个无界的带延迟的阻塞队列, 在delayQueue里元素,只有延迟时间过期后才可以被取出来.

队列的顶端的元素是延迟时间最长的. 如果没有延迟,头部就没有元素, poll的结果也就是null; 延迟的判断是根据 “delayed”元素对象 调用 getDelay(TimeUnit.NANOSECONDS) 的方法返回值是否小于或者等于0; 虽然未到期的元素不能通过take 或者 poll 删除, 但是仍然可以当做普通元素对象对待. 例如: size()方法返回所有元素的和(无论是否到期的元素). delayQueue不允许空元素. 添加null的元素将有NullpointException 抛出.

delayQueue它的迭代器,并没有按特定的顺序规则排序遍历.

使用场景

delayQueue 可以使用在很多的并发,带有延迟操作的工作中,也可以用在特殊的生产者-消费者模式上

  1. 超时任务处理上
  2. 延迟操作和清理过期数据业务上

使用方式

  • 创建延迟对象通过继承Delayed接口
  • 重新getDelay,compareTo 方法

代码示例


import java.util.Random;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class DelayTaskTester {

    private DelayQueue<DelayTask> delayQueue = new DelayQueue<DelayTask>();


    public static void main(String args[]) {
        DelayTaskTester tester = new DelayTaskTester();

        ExecutorService executorService = Executors.newFixedThreadPool(2, new ThreadFactory() {

            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setDaemon(true);
                return t;
            }
        });

        executorService.submit(tester.new DelayTaskCustomer());
        executorService.submit(tester.new DelayTaskCustomer());

        Random random = new Random();

        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 100; i++) {
            tester.delayQueue.offer(new DelayTask(random.nextInt(20 * 1000), startTime));
        }

        try {
            Thread.sleep(21 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        executorService.shutdown();

    }

    class DelayTaskCustomer implements Runnable {

        @Override
        public void run() {

            while (true) {
                try {
                    DelayTask delayTask = delayQueue.take();

                    delayTask.print();

                } catch (Throwable e) {
                    e.printStackTrace();
                }
            }

        }

    }

}

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class DelayTask implements Delayed {


    // 
    private final long timeStamp;

    // 记录开始时间
    private final long startTime;

    private final long delayTime;

    public DelayTask (final long delayTime, final long startTime) {
        this.delayTime = delayTime;
        this.timeStamp = System.currentTimeMillis();

        this.startTime = startTime;
    }

    public long getExpectTime() {
        return timeStamp + delayTime;
    }

    @Override
    public int compareTo(Delayed o) {
        if (this.getExpectTime() > ((DelayTask) o).getExpectTime()) {
            return 1;
        } else if (this.getExpectTime() < ((DelayTask) o).getExpectTime()) {
            return -1;
        } 

        return 0;
    }

    @Override
    public long getDelay(TimeUnit unit) {

        return unit.convert((this.timeStamp + delayTime) - System.currentTimeMillis(), TimeUnit.NANOSECONDS);
    }

    /*
     */
    public void print() {
        long now = System.currentTimeMillis();
        long realDelayTime = now - this.timeStamp;
        long Deviation  = realDelayTime - this.delayTime;

        System.out.println(Thread.currentThread().getName() +"--延迟时间是:" 
                + this.delayTime +"..真实延迟时间.......:" + realDelayTime + "......误差时间(单位毫秒)..::" +
                Deviation + "此时完成任务时间共经历时间: " + (now - startTime));
    }
}

测试结果

pool-1-thread-1--延迟时间是:610..真实延迟时间.......:610......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 610
pool-1-thread-2--延迟时间是:1000..真实延迟时间.......:1001......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 1001
pool-1-thread-1--延迟时间是:1115..真实延迟时间.......:1127......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 1127
pool-1-thread-1--延迟时间是:1146..真实延迟时间.......:1158......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 1158
pool-1-thread-1--延迟时间是:1150..真实延迟时间.......:1158......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 1158
pool-1-thread-1--延迟时间是:1170..真实延迟时间.......:1174......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 1174
pool-1-thread-1--延迟时间是:1307..真实延迟时间.......:1314......误差时间(单位毫秒)..::7此时完成任务时间共经历时间: 1314
pool-1-thread-2--延迟时间是:1505..真实延迟时间.......:1518......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 1518
pool-1-thread-2--延迟时间是:1630..真实延迟时间.......:1644......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 1644
pool-1-thread-2--延迟时间是:2084..真实延迟时间.......:2096......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 2096
pool-1-thread-2--延迟时间是:2155..真实延迟时间.......:2160......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 2160
pool-1-thread-2--延迟时间是:2432..真实延迟时间.......:2442......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 2442
pool-1-thread-1--延迟时间是:2557..真实延迟时间.......:2567......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 2567
pool-1-thread-1--延迟时间是:2605..真实延迟时间.......:2614......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 2614
pool-1-thread-2--延迟时间是:2681..真实延迟时间.......:2692......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 2692
pool-1-thread-2--延迟时间是:2721..真实延迟时间.......:2723......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 2723
pool-1-thread-2--延迟时间是:2913..真实延迟时间.......:2927......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 2927
pool-1-thread-1--延迟时间是:3058..真实延迟时间.......:3067......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 3067
pool-1-thread-1--延迟时间是:3273..真实延迟时间.......:3287......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 3287
pool-1-thread-1--延迟时间是:3567..真实延迟时间.......:3568......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 3568
pool-1-thread-1--延迟时间是:3747..真实延迟时间.......:3757......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 3757
pool-1-thread-1--延迟时间是:4367..真实延迟时间.......:4367......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 4367
pool-1-thread-2--延迟时间是:4815..真实延迟时间.......:4821......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 4821
pool-1-thread-2--延迟时间是:4826..真实延迟时间.......:4853......误差时间(单位毫秒)..::27此时完成任务时间共经历时间: 4853
pool-1-thread-1--延迟时间是:4963..真实延迟时间.......:4977......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 4977
pool-1-thread-1--延迟时间是:5050..真实延迟时间.......:5055......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 5055
pool-1-thread-1--延迟时间是:5069..真实延迟时间.......:5071......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 5071
pool-1-thread-2--延迟时间是:5192..真实延迟时间.......:5197......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 5197
pool-1-thread-2--延迟时间是:5794..真实延迟时间.......:5806......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 5806
pool-1-thread-1--延迟时间是:5881..真实延迟时间.......:5886......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 5886
pool-1-thread-1--延迟时间是:6318..真实延迟时间.......:6324......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 6324
pool-1-thread-1--延迟时间是:6410..真实延迟时间.......:6418......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 6418
pool-1-thread-1--延迟时间是:6415..真实延迟时间.......:6418......误差时间(单位毫秒)..::3此时完成任务时间共经历时间: 6418
pool-1-thread-2--延迟时间是:6584..真实延迟时间.......:6589......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 6589
pool-1-thread-1--延迟时间是:7040..真实延迟时间.......:7044......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 7044
pool-1-thread-2--延迟时间是:7090..真实延迟时间.......:7091......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 7091
pool-1-thread-1--延迟时间是:7126..真实延迟时间.......:7138......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 7138
pool-1-thread-1--延迟时间是:7535..真实延迟时间.......:7545......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 7545
pool-1-thread-1--延迟时间是:7649..真实延迟时间.......:7655......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 7655
pool-1-thread-1--延迟时间是:8097..真实延迟时间.......:8109......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 8109
pool-1-thread-2--延迟时间是:8478..真实延迟时间.......:8487......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 8487
pool-1-thread-1--延迟时间是:8747..真实延迟时间.......:8752......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 8752
pool-1-thread-2--延迟时间是:8832..真实延迟时间.......:8846......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 8846
pool-1-thread-2--延迟时间是:8876..真实延迟时间.......:8878......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 8878
pool-1-thread-2--延迟时间是:9088..真实延迟时间.......:9096......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 9096
pool-1-thread-2--延迟时间是:9211..真实延迟时间.......:9222......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 9222
pool-1-thread-2--延迟时间是:9648..真实延迟时间.......:9661......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 9661
pool-1-thread-2--延迟时间是:10020..真实延迟时间.......:10021......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 10021
pool-1-thread-2--延迟时间是:10198..真实延迟时间.......:10208......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 10208
pool-1-thread-1--延迟时间是:10630..真实延迟时间.......:10631......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 10631
pool-1-thread-1--延迟时间是:11155..真实延迟时间.......:11163......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 11163
pool-1-thread-1--延迟时间是:11244..真实延迟时间.......:11257......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 11257
pool-1-thread-1--延迟时间是:11357..真实延迟时间.......:11367......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 11367
pool-1-thread-1--延迟时间是:11459..真实延迟时间.......:11461......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 11461
pool-1-thread-1--延迟时间是:11468..真实延迟时间.......:11476......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 11476
pool-1-thread-1--延迟时间是:11719..真实延迟时间.......:11726......误差时间(单位毫秒)..::7此时完成任务时间共经历时间: 11726
pool-1-thread-1--延迟时间是:11722..真实延迟时间.......:11726......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 11726
pool-1-thread-2--延迟时间是:11820..真实延迟时间.......:11821......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 11821
pool-1-thread-1--延迟时间是:11906..真实延迟时间.......:11915......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 11915
pool-1-thread-1--延迟时间是:12208..真实延迟时间.......:12213......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 12213
pool-1-thread-2--延迟时间是:12404..真实延迟时间.......:12415......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 12415
pool-1-thread-1--延迟时间是:12727..真实延迟时间.......:12728......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 12728
pool-1-thread-2--延迟时间是:12955..真实延迟时间.......:12964......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 12964
pool-1-thread-1--延迟时间是:13201..真实延迟时间.......:13214......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 13214
pool-1-thread-1--延迟时间是:13440..真实延迟时间.......:13449......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 13449
pool-1-thread-1--延迟时间是:13788..真实延迟时间.......:13793......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 13793
pool-1-thread-2--延迟时间是:13814..真实延迟时间.......:13824......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 13824
pool-1-thread-2--延迟时间是:14016..真实延迟时间.......:14028......误差时间(单位毫秒)..::12此时完成任务时间共经历时间: 14028
pool-1-thread-1--延迟时间是:14191..真实延迟时间.......:14201......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 14201
pool-1-thread-2--延迟时间是:14265..真实延迟时间.......:14279......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 14279
pool-1-thread-1--延迟时间是:14422..真实延迟时间.......:14436......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 14436
pool-1-thread-1--延迟时间是:14525..真实延迟时间.......:14529......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 14529
pool-1-thread-1--延迟时间是:14669..真实延迟时间.......:14670......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 14670
pool-1-thread-1--延迟时间是:14718..真实延迟时间.......:14732......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 14732
pool-1-thread-1--延迟时间是:14886..真实延迟时间.......:14889......误差时间(单位毫秒)..::3此时完成任务时间共经历时间: 14889
pool-1-thread-1--延迟时间是:14929..真实延迟时间.......:14937......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 14937
pool-1-thread-1--延迟时间是:15041..真实延迟时间.......:15046......误差时间(单位毫秒)..::5此时完成任务时间共经历时间: 15046
pool-1-thread-1--延迟时间是:15330..真实延迟时间.......:15344......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 15344
pool-1-thread-1--延迟时间是:15362..真实延迟时间.......:15375......误差时间(单位毫秒)..::13此时完成任务时间共经历时间: 15375
pool-1-thread-1--延迟时间是:15812..真实延迟时间.......:15813......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 15813
pool-1-thread-1--延迟时间是:16022..真实延迟时间.......:16032......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 16032
pool-1-thread-2--延迟时间是:16056..真实延迟时间.......:16063......误差时间(单位毫秒)..::7此时完成任务时间共经历时间: 16063
pool-1-thread-2--延迟时间是:16095..真实延迟时间.......:16095......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 16095
pool-1-thread-1--延迟时间是:16248..真实延迟时间.......:16251......误差时间(单位毫秒)..::3此时完成任务时间共经历时间: 16251
pool-1-thread-1--延迟时间是:16313..真实延迟时间.......:16314......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 16314
pool-1-thread-2--延迟时间是:16318..真实延迟时间.......:16329......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 16329
pool-1-thread-1--延迟时间是:16697..真实延迟时间.......:16706......误差时间(单位毫秒)..::9此时完成任务时间共经历时间: 16706
pool-1-thread-2--延迟时间是:16901..真实延迟时间.......:16909......误差时间(单位毫秒)..::8此时完成任务时间共经历时间: 16909
pool-1-thread-1--延迟时间是:17252..真实延迟时间.......:17253......误差时间(单位毫秒)..::1此时完成任务时间共经历时间: 17253
pool-1-thread-2--延迟时间是:17322..真实延迟时间.......:17332......误差时间(单位毫秒)..::10此时完成任务时间共经历时间: 17332
pool-1-thread-1--延迟时间是:17475..真实延迟时间.......:17489......误差时间(单位毫秒)..::14此时完成任务时间共经历时间: 17489
pool-1-thread-2--延迟时间是:17478..真实延迟时间.......:17489......误差时间(单位毫秒)..::11此时完成任务时间共经历时间: 17489
pool-1-thread-1--延迟时间是:17686..真实延迟时间.......:17692......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 17692
pool-1-thread-1--延迟时间是:17936..真实延迟时间.......:17942......误差时间(单位毫秒)..::6此时完成任务时间共经历时间: 17942
pool-1-thread-1--延迟时间是:17986..真实延迟时间.......:17989......误差时间(单位毫秒)..::3此时完成任务时间共经历时间: 17989
pool-1-thread-1--延迟时间是:18114..真实延迟时间.......:18114......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 18114
pool-1-thread-2--延迟时间是:18158..真实延迟时间.......:18162......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 18162
pool-1-thread-1--延迟时间是:18565..真实延迟时间.......:18567......误差时间(单位毫秒)..::2此时完成任务时间共经历时间: 18567
pool-1-thread-1--延迟时间是:18863..真实延迟时间.......:18867......误差时间(单位毫秒)..::4此时完成任务时间共经历时间: 18867
pool-1-thread-1--延迟时间是:19952..真实延迟时间.......:19952......误差时间(单位毫秒)..::0此时完成任务时间共经历时间: 19952
发布了49 篇原创文章 · 获赞 13 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章