BlockingQueue是java.util.concurrent提供的一个工具接口。BlockingQueue的主要特征是,向empty queue取数据或者向full queue插入数据时,可以阻塞等待条件成熟。BlockingQueue实现的子类有以下几个:
ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedTransferQueue, PriorityBlockingQueue, SynchronousQueue
BlockingQueue的方法可以按照执行是否能立即成功分为4大类:
- Throws exception: 当add、remove、element失败后,抛出异常
- Special value: 当offer、poll、peek失败后,根据操作的类型,返回false、null
- Blocks: 当put、take不能立即成功,会阻塞线程直到操作能够成功。
- Times out:offer、poll阻塞指定的时间后,返回一个特定的值。
注意事项
BlockingQueue不接受null元素,当试图put、offer或者offer一个null元素时,会抛出NullPointerException。null会作为poll的一个特殊的返回值。
BlockingQueue可以设置容量大小,当没有显示指定时,大小是 Integer.MAX_VALUE。
BlockingQueue 是线程安全的,所有的单个元素的操作都是原子性的,但是批量操作不是原子性的。比如addAll、containsAll、retainAll、removeAll。
BlockingQueue不支持close或者shutdown操作,不能显示的指定此队列不能插入元素。