BlockingQueue
阻塞队列,所谓的阻塞是指,当队列已满时,会阻塞当前添加元素的线程,直到队列不满或者等到超时;当队列为空时,会阻塞当前获取元素的线程,直到队列不空或者等待超时。
核心方法
压入元素
add(E e)
:向队尾增加元素,设置成功返回true。如果使用了capacity-restricted队列,即限定了容量的队列,推荐使用offer()
方法。offer(E e)
:向队尾增加元素,设置成功返回true,如果队列中没有多余的空间返回false。put(E e)
:向队尾增加元素,如果队列中没有多余的空间,该方法会一直阻塞。
弹出元素
-
poll()
:获取并移除队首元素,如果队列为空,返回null。 -
take()
:获取并移除队首元素,如果队列为空,该方法会一直阻塞。 -
peek()
:获取但是并不移除队首元素,如果队列为空,返回null。
其他操作
contains(Obeject o)
:判断队列中是否包含该元素。int drainTo(Collection<? super E> c)
:将队列转化为集合。
实现类
实现类 | 底层数据结构 | 是否有界 | 其他 |
---|---|---|---|
ArrayBlockingQueue | arrayList | 有界 | 只有一把锁,入队高并发或出队高并发的情况下推荐使用 |
LinkedBlockingQueue | linkedList | 默认无界,可指定上限 | 两把锁,在入队与出队都高并发的情况下推荐使用 |
DelayQueue | heap | 无界 | 延迟期满时才能从中提取元素 |
PriorityBlockingQueue | heap | 无界 | 基于优先级的阻塞队列 |
SynchronousQueue | 无 | 有界 | 无缓冲的阻塞队列,只能容纳一个元素,向队列中插入一个新元素的线程将会阻塞,直到另一个线程将该元素从队列中抽走。 |
生产者消费者例子
Producer.java
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
/**
* @author liuergo
* @description 生产者
* @date 2019-11-10 00:23
*/
public class Producer implements Runnable {
private final BlockingQueue