BlockingQueue的实现类均为单向队列
接口方法:
操作 | 抛出异常 | 返回值 | 阻塞等待 | 延时等待 |
---|---|---|---|---|
添加 | add(E e) | offer(E e) | put(E e) | offer(E e,long timeout,TimeUnit unit) |
删除并获取 | remove() | poll() | take() | poll(long timeout,TimeUnit unit) |
获取队首 | element() | peek() |
- 抛出异常: 添加:成功时返回true,失败时抛出异常;删除:成功时返回被删除元素,失败时抛出异常;获取队首:成功时返回队首,失败时抛出异常
- 返回值: 添加:成功时返回true,失败时返回false;删除:成功时返回被删除元素,失败时返回null;获取队首:成功时返回队首,失败时返回null
- 阻塞等待: 添加:队列满时无法添加,将阻塞至队列可添加或响应中断;删除:队列空时无法删除,将阻塞至队列可删除或响应中断
- 超时等待: 可设置等待时间阈值,若等待时间超过阈值,则视为失败,返回失败时的返回值
- 补充说明:add方法与remove方法通过offer方法与poll方法实现,只是对于失败时的处理不同(抛出异常或返回值);put方法无返回值;元素默认遵循先进先出,即添加时添加至队尾,删除时删除队首
特点说明:
- BlockingQueue 不接受 null 元素,null 被用于标识失败的 poll 操作
- BlockingQueue 可以通过 remainingCapacity 方法重新设置容量;BlockingQueue 的默认最大容量为 Integer.MAX_VALUE(部分实现类的构造方法强制指定初始容量)
- BlockingQueue 的实现主要用于生产者-消费者模式,BlockingQueue 支持 Collection 接口,因此,使用例如 remove(x) 的方法从队列中删除任意一个元素是可能的(若实现类实现了该功能的话)
- BlockingQueue 的实现是线程安全的
BlockingDeque的实现类均为双向队列(实际上只有LinkedBlockingDeque)
接口方法:
操作 | 抛出异常 | 返回值 | 阻塞等待 | 超时等待 |
---|---|---|---|---|
添加 | addFirst(E e) | offerFirst(E e) | putFirst(E e) | offerFirst(E e,long timeout,TimeUnit unit) |
删除并获取 | removeFirst() | pollFirst() | takeFirst() | pollFirst(long timeout,TimeUnit unit) |
获取队首 | getFirst() | peekFirst() |
操作 | 抛出异常 | 返回值 | 阻塞等待 | 超时等待 |
---|---|---|---|---|
添加 | addLast(E e) | offerLast(E e) | putLast(E e) | offerLast(E e,long timeout,TimeUnit unit) |
删除并获取 | removeLast() | pollLast() | takeLast() | pollLast(long timeout,TimeUnit unit) |
获取队首 | getLast() | peekLast() |
BlockingDeque 接口继承了 BlockingQueue 接口,所以其实现类需要实现 BlockingQueue 接口的方法,换言之,BlockingDeque 接口的实现类的实例可调用上文中陈述的 BlockingQueue 接口的方法
BlockingDeque 与 BlockingQueue 均线程安全,均不接受 null 元素,均可通过remainingCapacity 方法重新设置容量(BlockingDeque 的默认最大容量为 Integer.MAX_VALUE,其唯一实现类 LinkedBlockingDeque 允许不在构造方法中指定初始容量 )