• 技术文章 >java >java基础

    java ArrayBlockingQueue的方法及不足点

    小妮浅浅小妮浅浅2021-01-11 14:22:42原创2436

    提到ArrayBlockingQueue的方法,想必大家都不陌生,我们在入队和出队的时候,接触了不少这方面的函数。当然ArrayBlockingQueue中的方法也不止于此,今天我们就全部为大家罗列出来,也算是做一个学习方向上的指引。然后就其中的peek方法带来实例介绍,并说明ArrayBlockingQueue使用的不足之处。

    1.ArrayBlockingQueue函数列表

    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

    // 创建一个带有给定的(固定)容量和默认访问策略的 ArrayBlockingQueue。

    ArrayBlockingQueue(int capacity)

    // 创建一个具有给定的(固定)容量和指定访问策略的 ArrayBlockingQueue。

    ArrayBlockingQueue(int capacity, boolean fair)

    // 创建一个具有给定的(固定)容量和指定访问策略的 ArrayBlockingQueue,它最初包含给定 collection 的元素,并以 collection 迭代器的遍历顺序添加元素。

    ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)

      

    // 将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回 true,如果此队列已满,则抛出 IllegalStateException。

    boolean add(E e)

    // 自动移除此队列中的所有元素。

    void clear()

    // 如果此队列包含指定的元素,则返回 true。

    boolean contains(Object o)

    // 移除此队列中所有可用的元素,并将它们添加到给定 collection 中。

    int drainTo(Collection<? super E> c)

    // 最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定 collection 中。

    int drainTo(Collection<? super E> c, int maxElements)

    // 返回在此队列中的元素上按适当顺序进行迭代的迭代器。

    Iterator<E> iterator()

    // 将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回 true,如果此队列已满,则返回 false。

    boolean offer(E e)

    // 将指定的元素插入此队列的尾部,如果该队列已满,则在到达指定的等待时间之前等待可用的空间。

    boolean offer(E e, long timeout, TimeUnit unit)

    // 获取但不移除此队列的头;如果此队列为空,则返回 null。

    E peek()

    // 获取并移除此队列的头,如果此队列为空,则返回 null。

    E poll()

    // 获取并移除此队列的头部,在指定的等待时间前等待可用的元素(如果有必要)。

    E poll(long timeout, TimeUnit unit)

    // 将指定的元素插入此队列的尾部,如果该队列已满,则等待可用的空间。

    void put(E e)

    // 返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的其他元素数量。

    int remainingCapacity()

    // 从此队列中移除指定元素的单个实例(如果存在)。

    boolean remove(Object o)

    // 返回此队列中元素的数量。

    int size()

    // 获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。

    E take()

    // 返回一个按适当顺序包含此队列中所有元素的数组。

    Object[] toArray()

    // 返回一个按适当顺序包含此队列中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

    <T> T[] toArray(T[] a)

    // 返回此 collection 的字符串表示形式。

    String toString()

    2.peek方法实例

    读取队列中队首的元素,不会删除该元素。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    //获取元素,元素不出队

    public E peek() {

            //上锁

            final ReentrantLock lock = this.lock;

            lock.lock();

            try {

                //调用itemAt方法获取元素

                return itemAt(takeIndex); // null when queue is empty

            } finally {

                //释放锁资源

                lock.unlock();

            }

        }

    3.ArrayBlockingQueue缺点

    1)队列长度固定且必须在初始化时指定,所以使用之前一定要慎重考虑好容量;

    2)如果消费速度跟不上入队速度,则会导致提供者线程一直阻塞,且越阻塞越多,非常危险;

    3)只使用了一个锁来控制入队出队,效率较低

    以上就是java ArrayBlockingQueue的方法及不足点,大家可以对其中的方法保存下来,方便下次的查询和使用,同时不断学习ArrayBlockingQueue方法的实例操作,从而加深理解。

    专题推荐:java arrayblockingqueue
    上一篇:java中ArrayBlockingQueue的出队 下一篇:java中linkedblockingqueue用法

    相关文章推荐

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

    全部评论我要评论

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

  • 取消发布评论
  • 

    Python学习网