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 可以使用在很多的并发,带有延迟操作的工作中,也可以用在特殊的生产者-消费者模式上
- 超时任务处理上
- 延迟操作和清理过期数据业务上
使用方式
- 创建延迟对象通过继承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
- DelayQueue 学习
- BlockingQueue和DelayQueue学习
- DelayQueue 学习和应用
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- delayqueue
- DelayQueue
- Thinking in Java学习笔记 DelayQueue和Delayed接口
- java Thread学习(新类库CountDownLatch+CyclicBarrier+DelayQueue)
- [JAVA学习笔记-88]DelayQueue实现Leader-Follower pattern
- DelayQueue 队列
- DelayQueue 用法
- [HotSpot VM] JVM调优的"标准参数"的各种陷阱
- 树形DP_______Strategic game( POJ 1463 )
- QPixmap和QImage的区别
- 用JDK中的 jps、jinfo、jstat、jstack、jmap、jconsole等命令对JVM,内存,线程进行分析和故障诊断
- Codeforces Round #368 (Div. 2) A~D
- DelayQueue 学习
- VMwave虚拟机安装linux,ubuntu系统及配置
- 一步步优化JVM一:概述、方法及需求
- 【项目管理和构建】——Maven下载、安装和配置(二)
- Android-满屏幕拖动的控件
- 关于数塔一类问题的动态规划问题
- 代理模式:女朋友这么漂亮,你缺经纪人吗?
- 一种提示用户的dialog动画
- JavaSE基础笔记 day01