Java中常见的八个堵塞堆栈第二卷DelayQueue源标识符如是说

透过后面三篇该文,他们对堆栈有了介绍及早已重新认识了常见堵塞堆栈中的四个了。第一集他们竭尽全力如是说剩的两个堆栈。

责任撰稿主要就文本:透过源标识符自学Delayqueue及认知Dqueue他用标识符单纯模拟采用情景。

责任撰稿出自于凯哥Java(kaigejava)的《凯哥Javamammalian系列产品》之《Javamammalian程式设计之堆栈》系列产品的第二篇:《Java中常见的八个堵塞堆栈第二卷DelayQueue源标识符如是说》

Java中常见的两个堆栈中,堵塞堆栈除了五个没如是说。如下表所示图:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图

DelayQueue

先上归纳脑图:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图1

撰稿

来看一看内部结构器:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图2

全力支持无参和全力支持间接放置两个子集的。

再来看一看为何说DQueue堆栈采用的是PriorityQueue同时实现的呢?

来看一看源标识符:

在添加元素的offer方法源标识符中,他们可以看到终调用的是q.offer(e)这个方法的。那么q又是什么呢?他们接着跟下去:private final PriorityQueue q = new PriorityQueue ();。发现q是PriorityQueue这个堆栈。如下表所示图:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图3

为何说可以延时呢?

他们来看一看DQueyue类的定义:

public class DelayQueue extends AbstractQueue

implements BlockingQueue {}

从源标识符中,他们可以看到DQueue堆栈中放置的元素必须要同时实现Delayed接口。

他们在来看一看Delayed接口的方法:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图4

只有,long getDelay(TimeUnit unit);方法。设置等待时间。

在从堆栈中获取数据的时候会对超时时间进行判断的。当超时时间小于等于0的时候,才会调用priorityQueue堆栈的poll()方法。具体源标识符如下表所示:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图5

从源标识符中,他们可以看到,DQueue延时处理的:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图6

无界怎么认知?

说DQueue无界,他们应该从源标识符中查找。DQueue堆栈是基于PriorityQueue堆栈来同时实现的。那么他们来看一看PriorityQueue堆栈添加元素的源标识符。

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图7

从上图中,他们可以看到,在添加元素的时候offer方法会进行判断,当i的值大于等于堆栈的长的时候,会调用grow()方法来进行扩容。在grow方法中,他们可以看到会采用Arrsys.copyof()方法复制一份给堆栈。这样堆栈完成了库容。没有大小的限制。所以说是无界的。

堵塞认知

当堆栈为空的时候,获取/取元素操作将会block,被堵塞着。他们来看一看源标识符是怎么同时实现的。

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图8

从源标识符中他们可以看到,当从堆栈中获取元素的时候,先判断,如果个元素为空的时候,等待。当等待的时间小于等于延时时间的话,从堆栈中poll了;如果leader不为空的话,说明当前堆栈不是队首元素,依然await。

全力支持优先级

因为在PQueue堆栈的添加方法中,采用了comparator.compare方法。源标识符如下表所示图:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图9

所以透过源标识符分析他们可以到得到DelayQueue如下表所示脑图:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图10

采用情景:

DQueue非常有用的。他们利用DQueue的延时特性,可以讲DQueue应用于以下情景:

1:缓存的设计。可以利用Dqueue保存缓存元素的有效期。采用两个线程循环的从堆栈中获取数据。一旦获取到数据,说明缓存有效期到了。

2:定时任务调度。可以采用Dqueue保存需要执行的任务和任务执行的时间,一旦从DQueue中获取到了任务,开始执行任务了。比如TimerQueue是采用了DelayQueue来同时实现的。

下面凯哥(凯哥Java:kaigejava)透过标识符单纯模拟模拟缓存过期时间的案例。

标识符模拟:

需求:模拟缓存设置有效期。

说明:当从堆栈中获取到元素,说明元素的有效期到了。

模拟缓存的对象:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图11

内部结构器:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图12

需要注意:time=传递的time+当前时间。

同时实现了Delayed接口,需要重写getDelay和compartTo方法。

重写方法如下表所示:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图13

返回的是time与当前时间之间的差值。

compareTo方法如下表所示:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图14

调用方法:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图15

来看一看运行结果:

Python中常见的八个堵塞堆栈第二卷DelayQueue源代码如是说插图16

从运行结果中,他们可以看到,从打印出开始获取到k1的输出之间相差1s;K1与k2之间相差2s;K3和K2之间也相差2s.符合他们上面预设的时间差。

作者 nasiapp

在线客服
官方客服
我们将24小时内回复。
12:01
您好,有任何疑问请与我们联系!

选择聊天工具: