并发容器之阻塞队列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框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享. 请尊重作者劳动成果,转载请标明原文链接: ...
随机推荐
- js父窗体关闭,子窗体紧随
近来的.我们遇到了权限管理系统.由于权限管理系统与原系统的风格不符.打开一个全新的窗口.问题就来了.admin取消后,,权限管理形式不关闭.其他普通用户登录后.尚能经营权的管理形式. 简化问题:adm ...
- Linux性能测试 ulimit命令
功能说明:控制shell程序的资源. 语 法:ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大 小>][-m &l ...
- 【 D3.js 入门系列 --- 9.3 】 弦图生产
我个人的博客: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 弦图( Chord ),主要用于表示两个节点之间的联系.例如以下图: ...
- 如何直接访问WEB-INF下列文件
<servlet> <servlet-name>HE</servlet-name> <jsp-file>/WEB-INF/u_member/Login. ...
- nginx 502错 failed (13: Permission denied)
安装nginx和php-fpm之后出现502错误 找了个理由说php-fpm不启动 ,但在我的实践中,该过程开始 找了半天没找到病因.视图nginx记录后 我发现下面的错误 [crit] 2686#0 ...
- Ubuntu 14.04 64位字体美化(使用黑文泉驿)
Ubuntu 14.04安装和升级后,,斜体字体变得很难看,昨天,我得到一个晚上,最终,管理一个线索,这里整洁. 在线调研后,.一致的观点是,,使用开源字体库文泉驿理想的黑色字体效果,效果甚至没有丢失 ...
- cocos2d-x 源代码分析 : Ref (CCObject) 源代码分析 cocos2d-x内存管理策略
从源代码版本号3.x.转载请注明 cocos2d-x 总的文件夹的源代码分析: http://blog.csdn.net/u011225840/article/details/31743129 1.R ...
- Entity framework 配置文件,实现类,测试类
配置文件信息App.config: 数据库IP地址为192.168.2.186 ,数据库名为 Eleven-Six , 用户名 123456,密码654321 <?xml version=&qu ...
- wpf C# 操作DirectUI窗口 SendMessage+MSAA
原文:wpf C# 操作DirectUI窗口 SendMessage+MSAA 最近做一个抓取qq用户资料的工具,需要获取qq窗口上的消息,以前这种任务是用句柄获取窗口中的信息,现在qq的窗口用的是D ...
- Bootstrap 媒体对象 列表组
@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport&q ...