BlockingQueue 方法详细描述
BlockingQueue 简单看可以是一个集合,因为的他的父类Queue<?>
继承了Collection<?>
。所以它拥有了集合基础方法和特征。
一、常用方法解析。
public interface BlockingQueue<E> extends Queue<E> {
/**
* 把e加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则throw new IllegalStateException("Queue full")
*/
boolean add(E e);
/**
* 把e加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续添加。
* @param e
* @throws InterruptedException
*/
void put(E e) throws InterruptedException;
/**
* 将e加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
*/
boolean offer(E e);
/**
* 将e加到BlockingQueue里。
* 多了的参数请看参数描述
* @param e 对象
* @param timeout 超时时间
* @param unit 超时时间单位(枚举类型),具体看源码
* @return 即如果BlockingQueue可以容纳,则返回true,否则返回false.
* @throws InterruptedException
*/
boolean offer(E e, long timeout, TimeUnit unit)
throws InterruptedException;
/**
* 取走BlockingQueue里排在第一个对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止.
* @return
* @throws InterruptedException
*/
E take() throws InterruptedException;
/**
* 取走BlockingQueue里排在第一个对象,若不能立即取出,则可以等time参数规定的时间,如果到达时间还取不到,那么返回Null
* @param timeout 时间
* @param unit 枚举时间单位,具体看源码
* @return
* @throws InterruptedException
*/
E poll(long timeout, TimeUnit unit)
throws InterruptedException;
}
其实上面分解的是:LinkedBlockingQueue<E>
二、使用的时候注意一些什么问题。
- 存储的对象不能为Null,否则会
throw NullPointerException
。 - BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个
remainingCapacity
,超出此容量,便无法无阻塞地put
附加元素。没有任何内部容量约束的 BlockingQueue 总是报告Integer.MAX_VALUE
的剩余容量。或者在new
的时候就给定额度。 - BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持
Collection
接口。因此,举例来说,使用remove(x)
从队列中移除任意一个元素是有可能的。然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。 - BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的
Collection
操作(addAll
、containsAll
、retainAll
和removeAll
)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了c 中的一些元素后,addAll(c)
有可能失败(抛出一个异常)。 - BlockingQueue 实质上不支持使用任何一种“
close
”或“shutdown
”操作来指示不再添加任何项。这种功能的需求和使用有依赖于实现的倾向。例如,一种常用的策略是:对于生产者,插入特殊的end-of-stream 或poison 对象,并根据使用者获取这些对象的时间来对它们进行解释。
三、简单说明它的常用实现类。
ArrayBlockingQueue
:规定大小的 BlockingQueue ,其构造函数必须带一个int
参数来指明其大小,其所含的对象是以FIFO(先入先出)顺序排序的。LinkedBlockingQueue
:大小不定的 BlockingQueue ,若其构造函数带一个规定大小的参数,生成的BlockingQueue
有大小限制,若不带大小参数,所生成的 BlockingQueue 的大小由Integer.MAX_VALUE来决定,其所含的对象是以FIFO(先入先出)顺序排序的。PriorityBlockingQueue
:类似于LinkedBlockQueue
,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的 Comparator 决定的顺序。SynchronousQueue
:特殊的 BlockingQueue ,对其的操作必须是放和取交替完成的。
PS:其中LinkedBlockingQueue
和ArrayBlockingQueue
比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue
的数据吞吐量要大于ArrayBlockingQueue
,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue
。
但是我还是用LinkedBlockingQueue
,就是这么任性。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/65.html
转载时必须以链接形式注明原始出处及本声明。
本文主题:
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。