Java中的延时队列DelayQueue是基于优先队列PriorityQueue实现的。

注:PriorityQueue是基于堆(Heap)实现的。堆(Heap)在本质上是一个数组。

Priority queue represented as a balanced binary heap: the two children of queue[n] are queue[2*n+1] and queue[2*(n+1)]. The priority queue is ordered by comparator, or by the elements' natural ordering, if comparator is null: For each node n in the heap and each descendant d of n, n <= d. The element with the lowest value is in queue[0], assuming the queue is nonempty.

以下为DelayQueue的使用演示。

1. 定义延时队列的元素


import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;public class DelayedItem<T> implements Delayed {/*** 到期时间,单位ms*/private long activeTime;private T data;public DelayedItem(long activeTime, T data) {super();this.activeTime = TimeUnit.NANOSECONDS.convert(activeTime, TimeUnit.MILLISECONDS) + System.nanoTime();this.data = data;}public long getActiveTime() {return activeTime;}public T getData() {return data;}@Overridepublic int compareTo(Delayed o) {long diff = getDelay(TimeUnit.NANOSECONDS) - getDelay(TimeUnit.NANOSECONDS);return diff == 0 ? 0 : (diff > 0 ? 1 : -1);}@Overridepublic long getDelay(TimeUnit unit) {long diff = unit.convert(activeTime - System.nanoTime(), TimeUnit.NANOSECONDS);return diff;}
}

2. 定义消费者

import java.util.concurrent.DelayQueue;public class Consumer implements Runnable {private DelayQueue<DelayedItem<String>> queue;public Consumer(DelayQueue<DelayedItem<String>> queue) {super();this.queue = queue;}@Overridepublic void run() {while (true) {try {DelayedItem<String> item = queue.take();String data = item.getData();String time = TimeUtils.getCurTime();System.out.printf("[%s] Consuming data:%s\r\n", time, data);} catch (InterruptedException e) {e.printStackTrace();}}}
}

3. 实现生产者主线程

import java.util.concurrent.DelayQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class DelayQueueDemo {public static void main(String[] args) {DelayQueue<DelayedItem<String>> queue = new DelayQueue<DelayedItem<String>>();queue.offer(new DelayedItem<String>(10_000, "A"));System.out.printf("[%s] produce message A\r\n", TimeUtils.getCurTime());queue.offer(new DelayedItem<String>(20_000, "B"));System.out.printf("[%s] produce message B\r\n", TimeUtils.getCurTime());ExecutorService executorService = Executors.newCachedThreadPool();executorService.execute(new Consumer(queue));executorService.shutdown();}
}

4. 查看输出

[2022-03-22 20:24:37.577] produce message A
[2022-03-22 20:24:37.629] produce message B
[2022-03-22 20:24:47.311] Consuming data:A
[2022-03-22 20:24:57.630] Consuming data:B

JAVA中的延时队列DelayQueue相关推荐

  1. 简析LIVE555中的延时队列

    最近在看LIVE555的源码,感觉其中的延时队列写的不错,于是就总结一下.     首先描述一下LIVE555中的延时队列的设计理念.首先,如下图,A,B,C分别为时间轴上的三个事件点,而head表示 ...

  2. Java中的常用队列

    目录 一.队列的理解 二.Java中队列简述 2.1 Queue队列 2.2 双端队列 2.3 阻塞队列 2.4 非阻塞队列 三.各队列的区别与联系 一.队列的理解 队列是一种由数组和链表作为底层构造 ...

  3. Java中栈和队列的用法 Stack And Queue

    Java中栈和队列的用法 栈的实现 使用Java的集合类Stack boolean isEmpty();//判断当前栈是否为空,等价于empty(); synchronized E peek();// ...

  4. java中的Queue队列的用法

    大家好,欢迎来到雄雄的小课堂,今天给大家分享的是"java中的Queue队列的用法" 前言:好多人对Queue不是很熟悉,毕竟平时也不怎么用,遇到集合要么List要么map这些常用 ...

  5. 聊聊并发(七)——Java中的阻塞队列

    1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用 ...

  6. java实现rabbitMQ延时队列详解以及spring-rabbit整合教程

    在实际的业务中我们会遇见生产者产生的消息,不立即消费,而是延时一段时间在消费.RabbitMQ本身没有直接支持延迟队列功能,但是我们可以根据其特性Per-Queue Message TTL和 Dead ...

  7. Java 中的阻塞队列

    目录 什么是阻塞队列 7 个阻塞队列 ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列. LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列. Priori ...

  8. java中常用的队列

    一.java中的队列 Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了De ...

  9. 聊聊Java中的并发队列中 有界队列和无界队列的区别

    转载自 https://blog.csdn.net/AJ1101/article/details/81711812 本文主要总体的说一说各种并发队列  首先来一张全体照  从有界无界上分  常见的有界 ...

最新文章

  1. Java三大主流框架概述--(转载)
  2. Hdu 3062. Party
  3. iOS----------使用cocoapods遇到的问题
  4. java中string和int的相互转换
  5. qt如何把dll封装到exe中_QT在VS2013中的配置
  6. qt project settings被禁用解决方案
  7. (1)封装JSON数据的三种方式
  8. 矩阵理论——正交变换
  9. Python三种设计模式
  10. 04 可视化开发工具
  11. 手把手教你制作gif动图,一分钟轻松学会
  12. 内存的速度和CPU缓存速度比较
  13. Ubuntu linux下运行xv6
  14. QT Q_OBJECT使用注意事项
  15. android自定义排班,Android实现一周时间早中晚排班表
  16. 董明珠500亿造芯片开始行动,踏上了光荣的荆棘路。
  17. 2021全国人工智能师资培训正式“开课”,百度飞桨助力高校教师提升AI“超能力”...
  18. torch之线性拟合
  19. python 自动识别并连接串口
  20. Linux 进程管理之进程的终结

热门文章

  1. springboot 后台管理系统源码
  2. 我与Python的偶遇(第二篇)
  3. 2022年信息安全工程师考试知识点:电子商务安全
  4. QNX系统ARM架构上protobuf文件读取乱码
  5. c++/win32实现模拟windows鼠标键盘操作
  6. 鼎捷软件贡献数字化智慧 赋能装备制造行业转型发展
  7. LVDS,LCD调试总结(持续更新)
  8. 取代 Mybatis Generator,这款代码生成神器配置更简单,开发效率更高
  9. CT影像中肺结节自动检测算法的验证、比较和组合:The LUNA16 challenge
  10. AIX6.1上重新安装RAC11G时,ASM无法识别磁盘为Candidate Dsik