juc 阻塞队列被问怕了,熬夜总结

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 c)。转移队列中的所有元素到另一个集合当中。
11. drainTo(Collection c, int maxElements)。转移队列中的指定最大量元素到另一个集合当中,返回实际移除的元素数量。

BlockingQueue 常用的实现类如下:

实现类 解析原文链接
ArrayBlockingQueue 查看详解
LinkedBlockingQueue 查看详解
PriorityBlockingQueue 查看详解
DelayQueue 查看详解
SynchronousQueue 查看详解
LinkedTransferQueue 查看详解
LinkedBlockingDeque 查看详解

我的一些理解:

  1. 阻塞队列是阻塞的,但是阻塞的情况分两种,一种是在获取锁的情况下会阻塞,另一个中是具体添加元素或者获取元素时,不满足一些条件(队列不为空或者队列未满),此时会通过一些方式进行阻塞。

你可能感兴趣的:(Java,并发,JDK源码)