BlockingQueue是concurrent中的阻塞队列,为多线程传输数据提供了方便,使用者不需要去实现线程之间的协调
什么是阻塞队列,首先它是一个队列(或者说集合),它是用来存放数据的,为什么说阻塞,当多个线程往队列里面放数据或取数据的时候,如果没有先来后到,乱取乱放,数据就脏了,所以我们需要协调多个线程之间的取和放,BlockingQueue就是实现了协调多线程功能的一个队列,使用者不再关心什么时候线程该阻塞,什么时候线程该唤醒,BlockingQueue已经包办这一切。
官方介绍:
A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.
(BlockingQueue是一个支持当获取数据的时候,如果队列里面没有数据则等待队列非空的时候再返回,当存放元素的时候,如果没有可用空间则等待队列可用时再存放)
BlockingQueue的方法有四种形式,有的操作在当前可能无法立即满足,但可能在未来某个时刻满足,分别如下:1、不能满足则抛出异常 2、不能满足则返回一个特殊值或者false 3、无限期阻塞当前线程直到操作成功 4、在给定的时间范围内等待,如果超时不能满足则放弃
此外,无法向一个 BlockingQueue 中插入 null。如果你试图插入 null,BlockingQueue 将会抛出一个 NullPointerException, 并且可以访问到 BlockingQueue 中的所有元素,而不仅仅是开始和结束的元素。比如说,你将一个对象放入队列之中以等待处理,但你的应用想要将其取消掉。那么你可以调用诸如 remove(o) 方法来将队列之中的特定对象进行移除。但是这么干效率并不高(译者注:基于队列的数据结构,获取除开始或结束位置的其他对象的效率不会太高),因此你尽量不要用这一类的方法,除非你确实不得不那么做