• 技术文章 >java >java基础

    java中PriorityBlockingQueue的入队

    小妮浅浅小妮浅浅2021-02-08 19:16:04原创2422

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

    1.入队规则

    (1)默认的插入规则中,新加入的元素可能会破坏小顶堆的性质,因此需要进行调整。

    (2)调整的过程为:从尾部下标的位置开始,将加入的元素逐层与当前点的父节点的内容进行比较并交换,直到满足父节点内容都小于子节点的内容为止。

    (3)默认的删除调整中,首先获取顶部下标和最尾部的元素内容,从顶部的位置开始,将尾部元素的内容逐层向下与当前点的左右子节点中较小的那个交换,直到判断元素内容小于或等于左右子节点中的任何一个为止。

    2.入队方法

    入队方法有:add(E), put(E), offer(E, timeout, TimeUnit), offer(E)

    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

    public void put(E e) {

        offer(e); // never need to block

    }

      

    public boolean offer(E e) {

        //判断是否为空

        if (e == null)

            throw new NullPointerException();

        //显示锁

        final ReentrantLock lock = this.lock;

        lock.lock();

        //定义临时对象

        int n, cap;

        Object[] array;

        //判断数组是否满了

        while ((n = size) >= (cap = (array = queue).length))

            //数组扩容

            tryGrow(array, cap);

        try {

            //拿到比较器

            Comparator<? super E> cmp = comparator;

            //判断是否有自定义比较器

            if (cmp == null)

                //堆上浮

                siftUpComparable(n, e, array);

            else

                //使用自定义比较器进行堆上浮

                siftUpUsingComparator(n, e, array, cmp);

            //队列长度 +1

            size = n + 1;

            //唤醒休眠的出队线程

            notEmpty.signal();

        } finally {

            //释放锁

            lock.unlock();

        }

        return true;

    }

    可以看出前三个方法内部都是通过 offer(e) 方法实现的。

    以上就是java中PriorityBlockingQueue的入队方法,在掌握基本的使用规则后,就可以对offer(e)方法进行重点学习,然后运行相关代码进行试验。

    专题推荐:java priorityblockingqueue入队
    上一篇:PriorityBlockingQueue在java中的原理 下一篇:java PriorityBlockingQueue出队方法

    相关文章推荐

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

    全部评论我要评论

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

  • 取消发布评论
  • 

    Python学习网