并发容器之阻塞队列DelayQueue的使用案例及源码分析
原文连接:(http://www.studyshare.cn/blog-front//blog/details/1167/0 )
一、队列及阻塞队列概念
1、队列:是一种特殊线性表,特殊之处在于操作是受限制的,只允许在表的前端进行删除操作,在表的后端进行插入操作。进行删除操作的端为对列头,进
行插入操作的端为队列尾。插入一个元素称之为入队,删除一个元素称为出队,最先插入的元素最先出队,因此队列是一个先进先出的线性表。
2、阻塞队列:所谓阻塞队列,就是阻塞队列中有元素并且队列已经满了的时候,其他线程继续给队列中插入元素会被阻塞,直到队列有空间可存放为止;如
果队列中为空的时候,从队列中获取元素的线程也会被阻塞,直到队列中有元素可获取时为止。
3、生产者消费者模式:如果使用阻塞队列,则必定会使用生产者消费者模式,所谓生产者消费者模式是通过平衡生产线程和消费线程的工作能力来提高程序
整体处理数据的速度。
现在有两个线程,生产者就是一个生产数据的线程,消费者就是一个消费数据的线程,假如生产者线程产生数据很快,消费者线程消费数据很慢,那么生产者
线程就必须等待消费者线程处理完才能继续生产数据,同理,消费者线程需要等生产者线程产生了数据才能继续消费数据。
以上就是生产消费能力不均衡,为解决这个问题,便产生了生产者消费者模式,在生产者消费者之间使用一个容器来解耦合,使得生产者和消费者两者之间不
直接通信,生产者产生的数据往容器中(阻塞队列)尾部加入,消费者从阻塞队列头部去获取需要消费的数据。队列就相当于一个缓冲区,平衡了生产消费两
者的处理能力。
二、DelayQueue延时队列的应用案例
jdk为我们提供了很多阻塞队列的类,在此不一一列举,此处讲讲特别有用,且特别常用的一个阻塞队列--DelayQueue,该类在java.util.concurrent包下,该类
的特殊之处在于,这是一个带有延时功能的阻塞队列。开发中常用的场景如下:
1、缓存系统设计:可以使用DelayQueue保存缓存元素,并给该元素设置有效期,使用一个线程循环查询DelayQueue,如果一旦能从DelayQueue中获取到数
据,则表明该缓存元素到期了。
2、订单到期、限时支付:很多电商系统都有用户下单后限时支付功能,限定30分钟或者24小时需要去支付订单,否则该订单就会失效,需要重新下单。那么使
用DelayQueue解决这种需求是比较优雅的解决方案(不优雅的解决方案就是使用定时器进行定时轮询)。有一篇文章专门详细介绍了限时订单的几种解决方案,
参考限时订单实现方案(DelayQueue,ActivityMQ)。
此处以缓存系统设计为例,做简单的代码实现,展现一下DelayQueue的具体使用方式。
(1)、定义一个实现了Dalayed接口的实体类ItemVo,该类用来设置缓存过期时间和缓存数据


2、生产者、消费者线程实现


3、运行效果:

三、DelayQueue源码分析
阻塞队列的实现原理:使用等待通知模式实现,例如当生产者往一个满的队列中插入元素时,会被阻塞,当消费者将队列中的元素消费掉后,会通知生产者当前
队列可用。这就是等待通知模式。接下来看看DelayQueue的源码,了解它是如何实现的。
1、看DelayQueue的take()方法

2、看DelayQueue的put()方法,put中调用的是offer()方法,直接看offer()方法,如下

总结:DelayQueue使用的是PriorityQueue队列+等待通知机制来实现的。以上就是延时阻塞队列DelayQueue的使用及源码分析,如有疏漏之处,欢迎留言讨论。
原创文章,转载请注明出处。
java开发工具下载地址及安装教程大全,点这里。
更多深度技术文章,在这里。
并发容器之阻塞队列DelayQueue的使用案例及源码分析的更多相关文章
- Java并发容器之阻塞队列BlockingQueue
BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满:从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空. Bloc ...
- JUC 并发编程--09, 阻塞队列: DelayQueue, PriorityBlockingQueue ,SynchronousQueue, 定时任务线程池: ScheduledThreadPoolExecutor
先看DelayQueue 这个是用优先级队列实现的无界限的延迟队列,直接上代码: /** * 这个是 {@link DelayQueue} 延时队列 的验证使用类 */ class MyDelayed ...
- 并发编程之 ConcurrentHashMap(JDK 1.8) putVal 源码分析
前言 我们之前分析了Hash的源码,主要是 put 方法.同时,我们知道,HashMap 在并发的时候是不安全的,为什么呢?因为当多个线程对 Map 进行扩容会导致链表成环.不单单是这个问题,当多个线 ...
- Java并发编程:阻塞队列(转载)
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...
- 【转】Java并发编程:阻塞队列
在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...
- Java并发编程:阻塞队列 <转>
在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...
- 12、Java并发编程:阻塞队列
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...
- (转)Java并发编程:阻塞队列
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...
- Java多线程高并发学习笔记——阻塞队列
在探讨可重入锁之后,接下来学习阻塞队列,这边篇文章也是断断续续的写了很久,因为最近开始学ssm框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享. 请尊重作者劳动成果,转载请标明原文链接: ...
随机推荐
- POJ 1328 Radar Installation(经典贪婪)
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 54143 Accepted: 12 ...
- Angular route传参
从 router-link-page1 跳转 router-link-page2 和 router-link-page3 通过自定义路由 设置router-link-page2的路由后有3个参数,pa ...
- sql 从未连续的Id中选择10~30条数据
select * from(select *,row_number()over(order by ProductID) as num from Products) as t where t.num&g ...
- js div的显示和隐藏
<head> <title></title> <style type="text/css"> div ...
- 向WPF的Grid里面增加控件
在c#中,有时需要通过代码创建面板控件,但是对于面板的操作与之前的控件并不是很直观,因此记下方法,以供后来复习使用: 创建两行两列的表格: 第一种方法: Grid grid = new Grid(); ...
- 将QuickReport报表保存为图片(使用TMetaFile和TMetafileCanvas)
//将报表第iPageNo页存为BMP文件 procedure ReportSaveToBMPFile(sFileName :string; iPageNo :integer) ...
- MFC应用程序配置不正确解决方案(manifest对依赖的强文件名,WinSxs是windows XP以上版本提供的非托管并行缓存)
[现象] 对这个问题的研究是起源于这么一个现象:当你用VC++2005(或者其它.NET)写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件拷贝到别人电脑上时,便不能运行了,大致的错误提 ...
- Delphi Android 将Google ZXing 整合(调用Jar文件)
前篇文章介绍了在delphi App(以下简称App)中可使用intent来调用Google ZXing 条码扫描器(以下简称zx),其各有优缺点,优点是我们不需关注zx本身的细节,只需调用其接口即可 ...
- SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database)
原文:SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database) 一.本文所涉及的内容(Contents) 本文所涉及的内容 ...
- C# Excel导入Access
/// <summary> /// 导入 /// </summary> private void btn_In_Click(object sender, EventArgs e ...