并发容器之阻塞队列DelayQueue的使用案例及源码分析

原文连接:(http://www.studyshare.cn/blog/details/1167/0

一、队列及阻塞队列概念

1、队列:是一种特殊线性表,特殊之处在于操作是受限制的,只允许在表的前端进行删除操作,在表的后端进行插入操作。进行删除操作的端为对列头,进

行插入操作的端为队列尾。插入一个元素称之为入队,删除一个元素称为出队,最先插入的元素最先出队,因此队列是一个先进先出的线性表。

2、阻塞队列:所谓阻塞队列,就是阻塞队列中有元素并且队列已经满了的时候,其他线程继续给队列中插入元素会被阻塞,直到队列有空间可存放为止;如

果队列中为空的时候,从队列中获取元素的线程也会被阻塞,直到队列中有元素可获取时为止。

3、生产者消费者模式:如果使用阻塞队列,则必定会使用生产者消费者模式,所谓生产者消费者模式是通过平衡生产线程和消费线程的工作能力来提高程序

整体处理数据的速度。

现在有两个线程,生产者就是一个生产数据的线程,消费者就是一个消费数据的线程,假如生产者线程产生数据很快,消费者线程消费数据很慢,那么生产者

线程就必须等待消费者线程处理完才能继续生产数据,同理,消费者线程需要等生产者线程产生了数据才能继续消费数据。

以上就是生产消费能力不均衡,为解决这个问题,便产生了生产者消费者模式,在生产者消费者之间使用一个容器来解耦合,使得生产者和消费者两者之间不

直接通信,生产者产生的数据往容器中(阻塞队列)尾部加入,消费者从阻塞队列头部去获取需要消费的数据。队列就相当于一个缓冲区,平衡了生产消费两

者的处理能力。

java开发工具下载地址及安装教程大全,点这里
更多深度技术文章,在这里

二、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开发工具下载地址及安装教程大全,点这里
更多深度技术文章,在这里

原文地址:https://www.cnblogs.com/darendu/p/11133461.html