阻塞队列

阻塞队列(P668-673)

java.util.concurrent包提供了阻塞队列的几个变种。

LinkedBlockingQueue的容量是没有上边界的,但是,也可以选择指定最大容量。

LinkedBlockingDeque是一个双端的版本。ArrayBlockingQueue在构造时需要指定容量,并且有一个可选的参数来指定是否需要公平性。

PriorityBlockingQueue是一个带优先级的队列,而不是先进先出队列。元素按照它们的优先级顺序被移出。该队列是没有容量上限的。

阻塞队列方法

方法

正常动作

特殊情况下的动作

add

添加一个元素

如果队列满,则抛出IllegalStateException异常

element

返回队列的头元素

如果队列空,抛出NoSuchElementException异常

offer

添加一个元素并返回true

如果队列满,返回false

peek

返回队列的头元素

如果队列空,则返回null

poll

移出并返回队列的头元素

如果队列空,则返回null

put

添加一个元素

如果队列满,则阻塞

remove

移出并返回头元素

如果队列空,则抛出NoSuchElementException异常

take

移出并返回头元素

如果队列空,则阻塞

  • java.util.concurrent.ArrayBlockingQueue 5.0

    • ArrayBlockingQueue(int capacity)

    • ArrayBlockingQueue(int capacity, boolean fair)

      • 构造一个带有指定的容量和公平性设置的阻塞队列。该队列用循环数组实现。

  • java.util.concurrent.LinkedBlockingQueue 5.0

    • LinkedBlockingQueue()

      • 构造一个无上限的阻塞队列,用链表实现

    • LinkedBlockingQueue(int capacity)

      • 根据指定容量构造一个有限的阻塞队列,用链表实现

  • java.util.concurrent.LinkedBlockingDeque 6

    • LinkedBlockingDeque()

      • 构造一个无上限的阻塞双向队列,用链表实现

    • LinkedBlockingDeque(int capacity)

      • 根据指定容量构造一个有限的阻塞双向队列,用链表实现

  • java.util.concurrent.DelayQueue 5.0

    • DelayQueue()

      • 构造一个包含Delayed元素的无界的阻塞时间有限的阻塞队列。只有那些延迟已经超过时间的元素可以从队列移出。

  • java.util.concurrent.Delayed 5.0

    • long getDelay(TimeUnit unit)

      • 得到该对象的延迟,用给定的时间单位进行度量

  • java.util.concurrent.PriorityBlockingQueue 5.0

    • PriorityBlockingQueue()

    • PriorityBlockingQueue(int initialCapacity)

    • PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator)

      • 构造一个无边界阻塞优先队列,用堆实现

      • initialCapacity:优先队列的初始容量。默认值是11。

      • comparator:用来对元素进行的比较器,如果没有指定,则元素必须实现Comparable接口。

  • java.util.concurrent.TransferQueue 7

    • void transfer(E element)

    • boolean tryTransfer(E element, long time , TimeUnit unit)

      • 传输一个值,或者尝试在给定的超时时间内传输这个值,这个调用将阻塞,直到另一个线程将元素删除。第二个方法会在调用成功时返回true。

Last updated