• 技术文章 >java >java基础

    DelayQueue在java的出队

    小妮浅浅小妮浅浅2021-02-09 14:02:32原创2113

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

    1.DelayQueue类

    1

    2

    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出队实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

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

    专题推荐:java delayqueue出队
    上一篇:java中DelayQueue入队方法 下一篇:java DelayQueue处理订单超时

    相关文章推荐

    • python中的upper是啥意思• linkedblockingqueue在java中出队• java中DelayQueue是什么• java DelayQueue的原理• DelayQueue解决java中延时提醒• java中使用DelayQueue进行查询• java中DelayQueue入队方法• jquery遍历find()方法如何使用• python有几种可视化图形库?• python中如何使用np.delete()方法?

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网