本文主要是介绍线程池原理--任务队列BlockingQueue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 线程池原理--任务队列BlockingQueue
- 类继承体系
- 接口抽象方法
- 实现类
- ArrayBlockingQueue
- SynchronousQueue
- LinkedBlockingDeque
- LinkedBlockingQueue
- DelayQueue
- LinkedTransferQueue
- PriorityBlockingQueue
线程池原理–总索引
线程池原理–任务队列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 方法在队列为空的时候会阻塞)。
这篇关于线程池原理--任务队列BlockingQueue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!