BlockingQueue,也叫阻塞队列,本身是一个继承自Queue的接口,并在Queue的基础上支持了两个附加操作:
- 获取元素时,等待队列为非空
- 存储元素时,等待空间变得可用
这些方法有4中形式:
- 抛异常 ,如 add/remove/element;
- 返回特殊值(null或者false),如offer/poll/peek;
- 阻塞,如put/take;
- 超时,如带超时时间参数的offer/poll;
同时,它也不支持null元素;
BlockingQueue可以限制容量,也可以不限制,如果限制容量,当元素超出此容量时,则无法阻塞的进行put操作,如果不限制容量,则容量大小限制为Integer.MAX_VALUE。
BlockingQueue常用在生产-消费模型应用中。
实现了BlockingQueue的子类有这些:
ArrayBlockingQueue
这是一个由数组支持的BlockingQueue,本质上是一个“有界缓冲区”,拥有固定大小的数组,这样的缓冲区一旦被创建,就不能再增加其容量了。
该实现是按照先进先出的原则对元素进行排序的。
LinkedBlockingQueue
这是一个基于链表的,范围任意的BlockingQueue;
基于链表的队列的吞吐量通常要高于介于数组的队列,但是其在并发应用中,可预知性较低。
也可以在构造的时候传入容量范围,用来防止队列孤独拓展;如果没有指定范围,则容量限制为Integer.MAX_VALUE。
除非插入的节点会使队列超出容量,否则每次插入后都会动态创建节点。
PriorityBlockingQueue
这也是一个无界的阻塞队列,使用了与ProrityQueue相同的顺序规则,并提供了阻塞获取操作的支持。
它虽然逻辑上是无界的,但是如果资源耗尽的时候添加元素,仍然会抛出内存溢出异常。
它不支持null元素;
依赖自然顺序(可用比较器自定义其他顺序规则)的优先级队列不允许插入不可比较的对象。
它的iterator方法获得的迭代器并不保。以特定的顺序遍历元素,如果要保证顺序,建议使用Arrays.sort()方法,
同时它也不保证同样优先级元素的顺序。
DelayQueue
这也是一个无界的阻塞对垒,不过它只有在延迟期满的时候才能从中提取元素,具体的使用参考源码,这个类用的比较少,这里就不多说了。
SynchronousQueue
看名字就知道这是一个与同步有关的阻塞队列,其特点是每个插入的操作必须等待另一个线程的对应的溢出操作,反之亦然。
网友评论