juc 指的是 jdk 下的 java.util.concurrent
包,在这个包下提供了很多并发相关的工具类。本文将解析这个包下面的一些阻塞队列。
阻塞队列其实是实现了java.util.concurrent.BlockingQueue
接口的一些实现类,要搞明白阻塞队列,那么就要清楚这个接口到底是做什么的。
public interface BlockingQueue<E> extends Queue<E> {
boolean add(E e);
boolean offer(E e);
void put(E e) throws InterruptedException;
boolean offer(E e, long timeout, TimeUnit unit)
throws InterruptedException;
E take() throws InterruptedException;
E poll(long timeout, TimeUnit unit)
throws InterruptedException;
int remainingCapacity();
boolean remove(Object o);
public boolean contains(Object o);
int drainTo(Collection<? super E> c);
int drainTo(Collection<? super E> c, int maxElements);
}
总共有11个方法,根据注释可以了解到这些方法的意图。
1. add(E e)。在容量允许的情况下,添加元素到队列中,添加成功则返回 true,否则抛出异常。如果队列是有界的,那么推荐使用 offer 方法。
2. offer(E e)。添加元素到队列中,成功返 true,失败返回 false。
3. put(E e)。添加指定元素到队列中,该方法会一直等待直到队列中有可用空间为止。
4. offer(E e, long timeout, TimeUnit unit)。添加指定元素到队列中,该方法会等待一定时间,如果这段时间内添加成功,则返回true,否则返回false。
5. take()。从队列头部获取元素并移除,如果队列中没有数据则会一直阻塞,直到有数据为止。
6. poll(long timeout, TimeUnit unit)。从队列头部获取数据并移除,该方法会阻塞一定的时间,如果在这段时间内没有获取到数据,那么抛出 InterruptedException 异常。
7. remainingCapacity()。返回队列剩余的可用空间。
8. remove(Object o)。从队列中移除一个指定的元素,如果存在则返回 true,不存在则返回 false。
9. contains(Object o)。如果队列中包含指定的元素,那么返回 true,否则返回 false。
10. drainTo(Collection<? super E> c)。转移队列中的所有元素到另一个集合当中。
11. drainTo(Collection<? super E> c, int maxElements)。转移队列中的指定最大量元素到另一个集合当中,返回实际移除的元素数量。
BlockingQueue 常用的实现类如下:
实现类 | 解析原文链接 |
---|---|
ArrayBlockingQueue | 查看详解 |
LinkedBlockingQueue | 查看详解 |
PriorityBlockingQueue | 查看详解 |
DelayQueue | 查看详解 |
SynchronousQueue | 查看详解 |
LinkedTransferQueue | 查看详解 |
LinkedBlockingDeque | 查看详解 |
我的一些理解:
- 阻塞队列是阻塞的,但是阻塞的情况分两种,一种是在获取锁的情况下会阻塞,另一个中是具体添加元素或者获取元素时,不满足一些条件(队列不为空或者队列未满),此时会通过一些方式进行阻塞。