并发容器之阻塞队列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框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享. 请尊重作者劳动成果,转载请标明原文链接: ...
随机推荐
- 使用GDI+生成KnownColor列表
原文:使用GDI+生成KnownColor列表 在写这篇"GDI+与WPF中的颜色简析"之前,我试着使用GDI+生成KnownColor列表.现将关键代码贴出来吧. 最终效果图: ...
- 使用WPF创建画图箭头
原文:使用WPF创建画图箭头 今天要给leader line画个箭头,所以就google一下,找到下面的文章,写的不错,可以实现我的需求,所以就摘录下来. 我把源代码中的arraw.cs加入到我的工程 ...
- WPF 4 DataGrid 控件(自定义样式篇)
原文:WPF 4 DataGrid 控件(自定义样式篇) 在<WPF 4 DataGrid 控件(基本功能篇)>中我们已经学习了DataGrid 的基本功能及使用方法.本篇将继续 ...
- XF堆栈布局
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...
- jquery开关灯
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- 【C#】获取"我的电脑"的名字,如This PC、这台计算机
原文:[C#]获取"我的电脑"的名字,如This PC.这台计算机 注意:这里获取的[我的电脑]的名字,不是机器的名字.如图所示: 要获取的是This PC这个字符串. ----- ...
- FileHelper
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Win ...
- SQLServer 服务器架构迁移
原文:SQLServer 服务器架构迁移 最近服务器架构迁移,将原来的服务器架构迁移到新的服务器,新的服务器在硬件方面比之前更好!原来服务器使用双向同步,并且为水平划分到多个数据库服务器.迁移过程中, ...
- 零元学Expression Blend 4 - Chapter 41 Flash做的到的Blend也可以!轻松制作拥有动画的MenuBar!(中)
原文:零元学Expression Blend 4 - Chapter 41 Flash做的到的Blend也可以!轻松制作拥有动画的MenuBar!(中) 我们接着进行动画MenuBar的制作 接续着上 ...
- 【redis】redis的bind配置
原文:[redis]redis的bind配置 在配置文件redis.conf中,默认的bind 接口是127.0.0.1,也就是本地回环地址.这样的话,访问redis服务只能通过本机的客户端连接, ...