• 技术文章 >java >java基础

    java PriorityBlockingQueue出队方法

    小妮浅浅小妮浅浅2021-02-07 17:51:24原创2724

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

    1.出队过程

    1)加锁;

    2)判断是否出队成功,未成功就阻塞在notEmpty条件上;

    3)出队时弹出堆顶元素,并把堆尾元素拿到堆顶;

    4)再做自上而下的堆化;

    5)解锁;

    2.出队方法

    出队方法有 poll(), take(), poll(long timeout, TimeUnit unit),peek()

    poll 和 peek 与之前类似,这里不做说明。

    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

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    public E take() throws InterruptedException {

        //获取锁,可被中断

        final ReentrantLock lock = this.lock;

        lock.lockInterruptibly();

        E result;

        try {

            //如果队列为空,则阻塞,把当前线程放入notEmpty的条件队列

            while ( (result = dequeue()) == null)

                notEmpty.await();//阻塞当前线程

        } finally {

            lock.unlock();//释放锁

        }

        return result;

    }

    private E dequeue() {

        int n = size - 1;

        if (n < 0)

            return null;

        else {

            Object[] array = queue;

            E result = (E) array[0];// 弹出堆顶元素

            E x = (E) array[n];// 把堆尾元素拿到堆顶

            array[n] = null;

            Comparator<? super E> cmp = comparator;

            if (cmp == null)//自上而下的堆化

                siftDownComparable(0, x, array, n);

            else

                siftDownUsingComparator(0, x, array, n, cmp);

            size = n;

            return result;

        }

    }

    private static <T> void siftDownComparable(int k, T x, Object[] array,

                                               int n) {

        if (n > 0) {

            Comparable<? super T> key = (Comparable<? super T>)x;

            int half = n >>> 1;          

            // 只需要遍历到叶子节点就够了

            while (k < half) {

                // 左子节点

                int child = (k << 1) + 1;

                // 左子节点的值

                Object c = array[child];

                // 右子节点

                int right = child + 1;

                // 取左右子节点中最小的值

                if (right < n &&

                    ((Comparable<? super T>) c).compareTo((T) array[right]) > 0)

                    c = array[child = right];

                // key如果比左右子节点都小,则堆化结束

                if (key.compareTo((T) c) <= 0)

                    break;

                // 否则,交换key与左右子节点中最小的节点的位置

                array[k] = c;

                k = child;

            }

            // 找到了放元素的位置,放置元素

            array[k] = key;

        }

    }

    以上就是java中PriorityBlockingQueue的出队方法,一般而言我们都是使用take方法进行处理,其它的解决办法,大家也可以在课后进行了解。

    专题推荐:java priorityblockingqueue出队
    上一篇:java中PriorityBlockingQueue的入队 下一篇:java是什么

    相关文章推荐

    • SynchronousQueue在java中的元素增减• java中SynchronousQueue的核心方法• java PriorityBlockingQueue的使用• PriorityBlockingQueue在java中的原理• java中PriorityBlockingQueue的入队

    全部评论我要评论

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

  • 取消发布评论
  • 

    Python学习网