java并发队列之DelayQueue
为什么80%的码农都做不了架构师?>>>
特点:无界队列,阻塞队列,具有延时性。用于存放实现了Delayed接口的对象,其中的对象只能在到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。其中有两个重要的方法compareTo和getDelay,第一个是比较两个任务的延迟时间进行排序,第二个方法用来获取延迟时间。DelayQueue内部是使用PriorityQueue实现的。注意:不能将null元素放置到这种队列中。
应用场景:比如数据要在某个时间点,或者多长时间后进行某些操作,比如淘宝下单后一个小时后取消订单。
代码案例:
package com.example.web.web;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.*;@RestController public class HomeController {@RequestMapping("/index")public String index() throws Exception {DelayQueue<DelayedElement> delayQueue = new DelayQueue<DelayedElement>();//生产者producer(delayQueue);//消费者consumer(delayQueue);TimeUnit.SECONDS.sleep(30);return "网站已得到响应";}//每1000毫秒创建一个对象,放入延迟队列,延迟时间10000毫秒private static void producer(final DelayQueue<DelayedElement> delayQueue) {new Thread(() -> {for (int i = 0; i < 5; i++) {DelayedElement element = null;//将第三个元素过期时间提前if (i == 2) {element = new DelayedElement(3000, "test" + i);} else {element = new DelayedElement(10000, "test" + i);}delayQueue.offer(element);System.out.println(String.format("放入队列中一个数据:%s,长度:%s", element.msg, delayQueue.size()));//进行下一个添加进行休停下,不然时间一样就区分不出来try {TimeUnit.MILLISECONDS.sleep(50);} catch (Exception ex) {}}}).start();}//消费者,从延迟队列中获得数据,进行处理private static void consumer(final DelayQueue<DelayedElement> delayQueue) {new Thread(() -> {while (true) {DelayedElement element = null;try {//没有满足延时的元素 用poll返回 null//没有满足延时的元素 用take会阻塞System.out.println("准备开始读取数据....");element = delayQueue.take();System.out.println("读取数据操作完成....");} catch (Exception e) {e.printStackTrace();}System.out.println("获取到的数据信息" + element.msg);}}).start();} }class DelayedElement implements Delayed {//延迟时间private final long delay;//到期时间private final long expire;//队列数据public final String msg;public DelayedElement(long delay, String msg) {this.delay = delay;this.msg = msg;//到期时间 = 当前时间+延迟时间this.expire = System.currentTimeMillis() + delay;}//需要实现的接口,获得延迟时间 用过期时间-当前时间public long getDelay(TimeUnit unit) {return unit.convert(this.expire - System.currentTimeMillis(), TimeUnit.MILLISECONDS);}//用于延迟队列内部比较排序 当前时间的延迟时间 - 比较对象的延迟时间public int compareTo(Delayed o) {return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));} }
转载于:https://my.oschina.net/uwith/blog/3056134
java并发队列之DelayQueue相关推荐
- 10分钟搞定 Java 并发队列
前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...
- 10分钟搞定 Java 并发队列好吗?好的
前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...
- java并发队列_Java并发教程–阻塞队列
java并发队列 如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列 ...
- java 并发队列_JAVA并发编程:阻塞队列BlockingQueue之SynchronousQueue
前面在讲解Executors工厂创建可缓存线程的线程池(newCachedThreadPool)的时候有提到过SynchronousQueue队列,该线程池使用 SynchronousQueue 作为 ...
- Java并发队列ConcurrentLinkedQueue抢票示例
ConcurrentLinkedQueue并发抢票示例 在学习java并发的时候,在网上看了几个靠加锁方法块的方法来演示抢票的示例,运行起来还是要起并发冲突.后来看到一个用ConcurrentLink ...
- 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析...
LinkedBlockingQueue 在看源码之前,通过查询API发现对LinkedBlockingQueue特点的简单介绍: 1.LinkedBlockingQueue是一个由链表实现的有界队列阻 ...
- 解读 Java 并发队列 BlockingQueue
最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括我自己在仔仔细细看源码之前,也有许多的不解,甚至有些地方我一直都没有理解到位. 说到线程池实现,那么就不得不涉及到各种 ...
- Java并发编程中的若干核心技术,向高手进阶
来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...
- 阿里P8架构师手写12W字“Java并发手册”带你横扫全网
序言 很多同学学习Java并发一头扎进源码,最后头破血流,无功而返.横看成岭侧成峰,远近高低各不同.学习要始终从不同的视角来看待问题.学习并发亦是如此,需要通过理论远看轮廓,然后通过源码近看明细. 今 ...
- Java并发编程:阻塞队列
2019独角兽企业重金招聘Python工程师标准>>> 本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法 ...
最新文章
- c#数组赋初值_JavaScript数组的声明、访问和遍历方法
- C语言合理字符的代码,改善C语言程序代码的125个建议,第62到89个建议!
- 神经网络贷款风险评估(base on keras and python ) 原创 2017年08月18日 14:35:17 标签: python / 神经网络 / keras 300 用我
- 中国煤炭行业十四五投资战略与供需形势分析报告2022版
- QML模块定义qmldir文件
- 【嵌入式】C语言中volatile关键字
- mysql如何获取句柄_关于获取进程句柄的问题
- linux用户登录指定目录
- mac pandas文件路径_Mac进阶必看:如何利用Automator快速获取文件路径
- matlab 多重循环在最外层加断点_循环优化之循环分块(loop tiling)
- 全国计算机等级考试汇编,2011年3月汇编全国计算机等级考试(南开100题三级网络技术上机试题汇编)...
- Python - 装机系列24 消息工具 RabbitMQ详细了解
- 一人饮酒醉用计算机版,玩家自制游戏版《一人饮酒醉》,歪唱喊麦笑翻全场
- 使用无序列表ul实现多级菜单
- 百度云下载文件方法:PC 和 群晖 Docker
- Mac中Chrome浏览器的快捷键
- 一篇文章入门Spring
- ps顶级调色技术解密视频教程 终极大法
- Vue.js入门(学习笔记)
- 熊猫烧香作者李俊自主创业开网络安全公司