BlockingQueue接口

BlockingQueue接口

特性

  支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。
  
  BlockingQueue 不接受 null 元素。试图 add、put 或 offer 一个 null 元素时,某些实现会抛出 NullPointerException。null 被用作指示 poll 操作失败的警戒值。
  BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity,超出此容量,便无法无阻塞地 put 附加元素。没有任何内部容量约束的 BlockingQueue 总是报告 Integer.MAX_VALUE 的剩余容量。
  BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持 Collection 接口。因此,举例来说,使用 remove(x) 从队列中移除任意一个元素是有可能的。然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。
  BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和 removeAll)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了 c 中的一些元素后,addAll(c) 有可能失败(抛出一个异常)。
  BlockingQueue 实质上不 支持使用任何一种“close”或“shutdown”操作来指示不再添加任何项。这种功能的需求和使用有依赖于实现的倾向。例如,一种常用的策略是:对于生产者,插入特殊的 end-of-stream 或 poison 对象,并根据使用者获取这些对象的时间来对它们进行解释。

队列为空或者队列没有空间时的处理:

操作 抛出异常 返回特殊值 阻塞 超时
插入 add(e) offer(e) put(e) offer(e,time,unit)
删除 remove() poll() take() poll(time,unit)
查看 element() 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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

public interface BlockingQueue<E> extends Queue<E> {

/**

* 将指定元素插入此队列中(如果立即可行且不会违反容量限制),成功时返回 true,

* 如果当前没有可用的 空间,则抛出 IllegalStateException。

* 当使用有容量限制的队列时,通常首选 offer。

*/

boolean add(E e);

/**

* 将指定元素插入此队列中(如果立即可行且不会违反容量限制),成功时返回 true,

* 如果当前没有可用的空间,则返回 false。当使用有容量限制的队列时,此方法通

* 常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。

*/

boolean offer(E e);

/**

* 将指定元素插入此队列中,将等待可用的空间(如果有必要)。

*/

void put(E e) throws InterruptedException;



/**

* 将指定元素插入此队列中,在到达指定的等待时间前等待可用的空间(如果有必要)。

*/

boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;

/**

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

*/

E take() throws InterruptedException;



/**

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

*/

E poll(long timeout, TimeUnit unit) throws InterruptedException;



/**

* 返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的

* 附加元素数量;如果没有内部限制,则返回 Integer.MAX_VALUE。

*/

int remainingCapacity();

/**

* 从此队列中移除指定元素的单个实例(如果存在)。更确切地讲,

* 如果此队列包含一个或多个满足 o.equals(e) 的元素 e,则移除

* 该元素。如果此队列包含指定元素(或者此队列由于调用而发生

* 更改),则返回 true。

*/

boolean remove(Object o);



/**

* 如果此队列包含指定元素,则返回 true。更确切地讲,当且仅当此

* 队列至少包含一个满足 o.equals(e) 的元素 e时,返回 true。



*/

public boolean contains(Object o);

/**

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

* 此操作可能比反复轮询此队列更有效。在试图向 collection c 中添加元素

* 没有成功时,可能导致在抛出相关异常时,元素会同时在两个 collection

* 中出现,或者在其中一个 collection 中出现,也可能在两个 collection

* 中都不出现。如果试图将一个队列放入自身队列中,则会导致

* IllegalArgumentException 异常。此外,如果正在进行此操作时修改

* 指定的 collection,则此操作行为是不确定的。

*/

int drainTo(Collection<? super E> c);



/**

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

* collection 中。与上个函数相同。

*/

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

}

BlockingQueue实现类1:ArrayBlockingQueue和LinkedBlockingQueue