多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 阻塞队列 特性: * 阻塞队列提供可阻塞的put和take方法,支持定时offer和poll方法; * 如果阻塞队列已满,put方法将阻塞直到有空间可用; * 如果队列为空,take方法将会阻塞直到有元素可用; * 队列可用是有界也可以是无界,无界队列永远不会满,因此无界队列上的put方法也永远不会阻塞; 阻塞队列支持生产者——消费者模式 ``` public interface BlockingQueue<E> extends Queue<E> {} ``` ![](https://img.kancloud.cn/55/20/552079019cb6d2f34edb95dc56f28c37_721x79.png) LinkedBlockingQueue和ArrayBlockingQueue是FIFO队列; PriorityBlockingQueue是一个按优先级排序的队列,当希望按照某种顺序而不是FIFO来处理元素时可以使用PriorityBlockingQueue; BlockingQueue的核心方法有: * boolean add\(E e\),把e添加到BlockingQueue里。如果BlockingQueue可以容纳,则返回true,否则抛出异常。 * boolean offer\(E e\),表示如果可能的话,将e加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false。 * void put\(E e\),把e添加到BlockingQueue里,如果BlockQueue没有空间则调用此方法的线程被阻塞直到BlockingQueue里面有空间再继续。 * E poll\(long timeout, TimeUnit unit\),取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null。 * E take\(\) ,取走BlockingQueue里排在首位的对象,若BlockingQueue为空,则调用此方法的线程被阻塞直到BlockingQueue有新的数据被加入。 * int drainTo\(Collection&lt;? super E&gt; c\) 和 int drainTo\(Collection&lt;? super E&gt; c, int maxElements\) ,一次性从BlockingQueue获取所有可用的数据对象(还可以指定获取数据的个数),通过该方法,可以提升获取数据效率,不需要多次分批加锁或释放锁 * 注意:BlockingQueue不接受null元素。试图add、put 或offer 一个null 元素时,某些实现会抛出NullPointerException。null被用作指示poll操作失败的警戒值 ### 参考资料 * [http://blog.csdn.net/xin\_jmail/article/details/26157971](http://blog.csdn.net/xin_jmail/article/details/26157971)