技术文章 > java >  java基础 > 正文

DelayQueue在java的出队

小妮浅浅

对元素的操作上,因为DelayQueue的类是继承而来,所以我们必须要考虑到接口的问题。在出队的使用上,本篇以take为例,从出队流程开始讲解,在元素的状态上进行分类判断和讨论。在使用take方法时,相较于其它的方法有一定的难度,大家可以结合最后的实例进行理解。

1.DelayQueue类

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E>

DelayQueue 继承AbstractQueue抽象类,实现BlockingQueue接口,元素必须实现实现Delayed接口。

2.take()出队流程

(1)加锁;

(2)判断堆顶元素是否为空,为空的话直接阻塞等待;

(3)判断堆顶元素是否到期,到期了直接poll()出元素;

(4)没到期,再判断前面是否有其它线程在等待,有则直接等待;

(5)前面没有其它线程在等待,则把自己当作第一个线程等待delay时间后唤醒,再尝试获取元素;

(6)获取到元素之后再唤醒下一个等待的线程;

(7)解锁;

3.take出队实例

public E take() throws InterruptedException {
    final ReentrantLock lock = this.lock;
    lock.lockInterruptibly();
    try {
        for (;;) {
            E first = q.peek();
            if (first == null)
                available.await();
            else {
                long delay = first.getDelay(NANOSECONDS);
                if (delay <= 0)
                    return q.poll();
                first = null; // don't retain ref while waiting
                if (leader != null)
                    available.await();
                else {
                    Thread thisThread = Thread.currentThread();
                    leader = thisThread;
                    try {
                        available.awaitNanos(delay);
                    } finally {
                        if (leader == thisThread)
                            leader = null;
                    }
                }
            }
        }
    } finally {
        if (leader == null && q.peek() != null)
            available.signal();
        lock.unlock();
    }
}

以上就是DelayQueue在java的出队方法,相信大家已经对于阻碍队列中元素的操作得心应手。同时不要忘记在针对不同队列时,一些使用事项的注意点。

免费视频教程
本文原创发布python学习网,转载请注明出处,感谢您的尊重!
相关文章
 linkedblockingqueue在java中出队
 java中DelayQueue是什么
 java DelayQueue的原理
 DelayQueue解决java中延时提醒
 java中使用DelayQueue进行查询
 java中DelayQueue入队方法
相关视频章节
 网络爬虫
 云端部署Web应用程序视频
 Web应用框架Flask和文件模板
 Web应用程序开发概述
 继承和多态
推荐视频
视频教程分类