• 技术文章 >java >java基础

    java中ArrayBlockingQueue的出队

    小妮浅浅小妮浅浅2021-01-11 14:02:06原创2354

    对于队里的操作,有往其中添加元素,那么就会有取出元素的情况,我们把元素移除的行为称作出队。跟入队一样,出队同样用ArrayBlockingQueue中的方法进行实现:remove()、poll()、take()、poll。下面我们先来简单理解下出队的流程,再就其中两种出队的函数方法带来深入的探索。

    1.出队流程

    1)初始化情况是队列满的情况。

    2)来了一个线程,将队列中第一个元素取走。此时,队列中 putIndex 索引没有变化,而 takeIndex 索引指向了下一个位置。

    3)假设又来一条线程执行取出值操作,takeIdex 索引将会指向下一个位置。

    4)继续进行出队操作,直到 takeIndex 索引指向最后一个位置

    5)再次进行取出时,可以看到似乎有一次回到了原点。这就环形队列队列。

    2.出队方法

    出队有四个方法,它们分别是remove()、poll()、take()、poll

    poll 方法

    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

    34

    35

    //获取元素,如果队列没有元素直接返回null

    public E poll() {

            //上锁

            final ReentrantLock lock = this.lock;

            lock.lock();

            try {

                //如果队列有元素,调用dequeue获取元素,否则返回null

                return (count == 0) ? null : dequeue();

            } finally {

                //释放锁资源

                lock.unlock();

            }

        }

    //获取元素,如果队列没有元素,有超时时间的等待队列有元素入队

    public E poll(long timeout, TimeUnit unit) throws InterruptedException {

            //计算超时时间

            long nanos = unit.toNanos(timeout);

            //上锁

            final ReentrantLock lock = this.lock;

            lock.lockInterruptibly();

            try {

                while (count == 0) {

                    if (nanos <= 0)

                        //超时返回null

                        return null;

                    //带超时时间的条件等待

                    nanos = notEmpty.awaitNanos(nanos);

                }

                //未超时并且队列有元素,调用dequeue方法获取元素

                return dequeue();

            } finally {

                //释放锁资源

                lock.unlock();

            }

    }

    take 方法

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    //获取元素,如果队列没有元素,一直等待队列有元素入队

    public E take() throws InterruptedException {

            //上锁

            final ReentrantLock lock = this.lock;

            lock.lockInterruptibly();

            try {

                while (count == 0)

                    //while循环,如果队列没有元素,一直带条件等待

                    notEmpty.await();

                //调用dequeue方法获取元素

                return dequeue();

            } finally {

                //释放锁资源

                lock.unlock();

            }

        }

    以上就是java中ArrayBlockingQueue的出队方法,在学会了出队的流程后就可以进行实例操作。这里我们也需要对不同的函数方法有所了解,然后结合ArrayBlockingQueue的用法一起实现出队。

    专题推荐:java arrayblockingqueue出队
    上一篇:ArrayBlockingQueue在java的入队 下一篇:java ArrayBlockingQueue的方法及不足点

    相关文章推荐

    • BlockingQueue在java中的使用• java中ArrayBlockingQueue的使用• java ArrayBlockingQueue源码探讨• ArrayBlockingQueue在java的入队

    全部评论我要评论

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

  • 取消发布评论
  • 

    Python学习网