DelayQueue在java的出队

美女程序员鼓励师

本教程操作环境:windows7系统、java10版,DELL G3电脑。

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的出队方法,相信大家已经对于阻碍队列中元素的操作得心应手。同时不要忘记在针对不同队列时,一些使用事项的注意点。

以上是 DelayQueue在java的出队 的全部内容, 来源链接: utcz.com/z/542509.html

回到顶部