- 1、DelayQueue的作用
- 2、DelayQueue使用规则
- 3、DelayQueue的Demo
- 4、DelayQueue原理 *
- 5、DelayQueue的实现 *
1、DelayQueue的作用
作用便是线程调度机制通过粒度特别细的时间控制相应的元素在合适的时间出队,使用场景也是非常多的比如:缓存机制当中使用这个队列来控制缓存队列当中的缓存是否过期,如果过期则执行缓存过期以后的相应逻辑。
2、DelayQueue使用规则
DelayQueue从名字,我们知道是一个队列,并且继承自BlockingQueue,是一个阻塞队列,那么就有着阻塞队列的特点,当队列为空的时候,take方法将阻塞,这里需要注意的便是DelayQueue是一个无届队列,也就意味着,没有当队列为满的时候,所以就没有队满。put/add 阻塞的情况,其次DelayQueue最显著的特点便是,这个队列当中根据时间为优先级对队中的元素进行排序,如果我们take一个元素的时候,这个元素的时间值没有到,便会自动阻塞,当时间到以后take到元素。在DelayQueue这个队列当中所描述的任何一种元素必须实现Delay接口,而这个接口当中便定义了两个方法,我们通过这两个方法来进行队当中的排序,以及take的时候,相应的时间粒度的控制。
时间最长的在对头还是时间最短的在对头,这个主要看如何实现元素的 compareTo 方法。
- public int compareTo(T o);
- long getDelay(TimeUnit unit);
这里需要注意的是在getDelay当中获取时间的单位是NANOSECONDS,所以在写getDelay这个方法的时候注意使用的时间单位是NANOSECONDS。
3、DelayQueue的Demo
下面我们通过一个例子来看一下这个DelayQueue到底应该如何使用。本例子当中我们先根据时间短的先执行,打印了一遍执行顺序,然后通过一个List将原本初始化的时候的Runnable进行了保存,然后在最后进行打印,打印的顺序,便是初始化的顺序,也就是入队的时候的顺序。还有在方括号当中便是延时的时间,可以通过运行看一下,是否是等了相应的时间打印出来的这句话。目的就是让大家可以很直观的看到,我们通过DelayQueue是按照一个什么顺序进行排序的,最后通过一个任务将整个系统结束掉。
1 | /*** |