为什么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相关推荐

  1. 10分钟搞定 Java 并发队列

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  2. 10分钟搞定 Java 并发队列好吗?好的

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  3. java并发队列_Java并发教程–阻塞队列

    java并发队列 如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列 ...

  4. java 并发队列_JAVA并发编程:阻塞队列BlockingQueue之SynchronousQueue

    前面在讲解Executors工厂创建可缓存线程的线程池(newCachedThreadPool)的时候有提到过SynchronousQueue队列,该线程池使用 SynchronousQueue 作为 ...

  5. Java并发队列ConcurrentLinkedQueue抢票示例

    ConcurrentLinkedQueue并发抢票示例 在学习java并发的时候,在网上看了几个靠加锁方法块的方法来演示抢票的示例,运行起来还是要起并发冲突.后来看到一个用ConcurrentLink ...

  6. 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析...

    LinkedBlockingQueue 在看源码之前,通过查询API发现对LinkedBlockingQueue特点的简单介绍: 1.LinkedBlockingQueue是一个由链表实现的有界队列阻 ...

  7. 解读 Java 并发队列 BlockingQueue

    最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括我自己在仔仔细细看源码之前,也有许多的不解,甚至有些地方我一直都没有理解到位. 说到线程池实现,那么就不得不涉及到各种 ...

  8. Java并发编程中的若干核心技术,向高手进阶

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  9. 阿里P8架构师手写12W字“Java并发手册”带你横扫全网

    序言 很多同学学习Java并发一头扎进源码,最后头破血流,无功而返.横看成岭侧成峰,远近高低各不同.学习要始终从不同的视角来看待问题.学习并发亦是如此,需要通过理论远看轮廓,然后通过源码近看明细. 今 ...

  10. Java并发编程:阻塞队列

    2019独角兽企业重金招聘Python工程师标准>>> 本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法 ...

最新文章

  1. c#数组赋初值_JavaScript数组的声明、访问和遍历方法
  2. C语言合理字符的代码,改善C语言程序代码的125个建议,第62到89个建议!
  3. 神经网络贷款风险评估(base on keras and python ) 原创 2017年08月18日 14:35:17 标签: python / 神经网络 / keras 300 用我
  4. 中国煤炭行业十四五投资战略与供需形势分析报告2022版
  5. QML模块定义qmldir文件
  6. 【嵌入式】C语言中volatile关键字
  7. mysql如何获取句柄_关于获取进程句柄的问题
  8. linux用户登录指定目录
  9. mac pandas文件路径_Mac进阶必看:如何利用Automator快速获取文件路径
  10. matlab 多重循环在最外层加断点_循环优化之循环分块(loop tiling)
  11. 全国计算机等级考试汇编,2011年3月汇编全国计算机等级考试(南开100题三级网络技术上机试题汇编)...
  12. Python - 装机系列24 消息工具 RabbitMQ详细了解
  13. 一人饮酒醉用计算机版,玩家自制游戏版《一人饮酒醉》,歪唱喊麦笑翻全场
  14. 使用无序列表ul实现多级菜单
  15. 百度云下载文件方法:PC 和 群晖 Docker
  16. Mac中Chrome浏览器的快捷键
  17. 一篇文章入门Spring
  18. ps顶级调色技术解密视频教程 终极大法
  19. Vue.js入门(学习笔记)
  20. 熊猫烧香作者李俊自主创业开网络安全公司

热门文章

  1. wireshark的简单使用:在二进制流中还原出zip文件
  2. Android binder机制---概述
  3. 安装Ubuntu的那些事儿(续)
  4. 如何在命令行更改IP地址
  5. 用VIM编写C/C++程序
  6. ListBox横向绑定数据
  7. Ulysses for Mac(最好用的纯文本编辑器)v22(65099)直装版
  8. vue axios的路由拦截器
  9. BGP劫持信息有望通过基于推特的系统放送
  10. linux下 mysql 学习(一)