DelayQueue 学习

来源:互联网 发布:淘宝女装卫衣 编辑:程序博客网 时间:2024/06/02 05:03

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