线程池原理--任务队列BlockingQueue

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011676300/article/details/83054066


线程池原理–总索引

线程池原理–任务队列BlockingQueue

类继承体系

在这里插入图片描述
BlockingQueue不能够添加null对象,否则会抛出空指针异常。

接口抽象方法

  • boolean add(E e);
    添加元素,添加成功返回true ,添加失败抛出异常 IllegalStateException。
  • boolean offer(E e);
    true:添加元素成功 ; false : 添加元素失败。
  • void put(E e) throws InterruptedException;
    添加元素,直到有空间添加成功才会返回,阻塞方法。
  • boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;
    true:添加数据成功,false:超时时间到。
  • E take() throws InterruptedException;
    获取队头的元素,阻塞方法,会一直等到有元素获取到才会返回,获取到元素时并将队列中的该元素删除。
  • E poll(long timeout, TimeUnit unit) throws InterruptedException;
    获取队头的元素,阻塞方法,超时时间到则返回null,获取到元素时并将队列中的该元素删除。
  • int remainingCapacity();
    返回理想情况下此队列可以添加的其他元素的数量.
  • boolean remove(Object o);
    移除指定的元素。
  • boolean contains(Object o);
    检查是否包含该元素
  • int drainTo(Collection<? super E> c);
    移除队列中的所有元素并添加到集合c,返回被移除元素的数量。
  • int drainTo(Collection<? super E> c, int maxElements);
    移除队列中maxElements个元素并添加到集合c,返回被移除元素的数量。

实现类

所有的实现类都是并发安全的。

ArrayBlockingQueue

ArrayBlockingQueue 是 BlockingQueue 接口的有界队列实现类,底层采用数组来实现。其并发控制采用可重入锁来控制,不管是插入操作还是读取操作,都需要获取到锁才能进行操作。

SynchronousQueue

它是一个特殊的队列,它的名字其实就蕴含了它的特征 – - 同步的队列。为什么说是同步的呢?这里说的并不是多线程的并发问题,而是因为当一个线程往队列中写入一个元素时,写入操作不会立即返回,需要等待另一个线程来将这个元素拿走;同理,当一个读线程做读操作的时候,同样需要一个相匹配的写线程的写操作。这里的 Synchronous 指的就是读线程和写线程需要同步,一个读线程匹配一个写线程。

LinkedBlockingDeque

LinkedBlockingDeque就是一个双向队列,任何一端都可以进行元素的出入。底层基于单向链表实现的阻塞队列,可以当做无界队列也可以当做有界队列来使用。

LinkedBlockingQueue

LinkedBlockingQueue是一个单向队列,只能一端出一端入的单向队列结构,是有FIFO特性的,并且是通过两个ReentrantLock和两个Condition来实现的。底层基于单向链表实现的阻塞队列,可以当做无界队列也可以当做有界队列来使用。

DelayQueue

是一个支持延时获取元素的无界阻塞队列。内部用 PriorityQueue 实现。

LinkedTransferQueue

PriorityBlockingQueue

PriorityBlockingQueue是带排序的 BlockingQueue 实现,其并发控制采用的是 ReentrantLock,队列为无界队列(ArrayBlockingQueue 是有界队列,LinkedBlockingQueue 也可以通过在构造函数中传入 capacity 指定队列最大的容量,但是 PriorityBlockingQueue 只能指定初始的队列大小,后面插入元素的时候,如果空间不够的话会自动扩容)。

简单地说,它就是 PriorityQueue 的线程安全版本。不可以插入 null 值,同时,插入队列的对象必须是可比较大小的(comparable),否则报 ClassCastException 异常。它的插入操作 put 方法不会 block,因为它是无界队列(take 方法在队列为空的时候会阻塞)。

猜你喜欢

转载自blog.csdn.net/u011676300/article/details/83054066