什么是阻塞队列
阻塞队列是一个支持两个附加操作的队列。
- 支持阻塞的插入方法:当队列满时,插入会阻塞插入元素的线程,直到队列不满
- 支持阻塞的移除方法:当队列空时,移除会阻塞移除元素的线程,直到队列不空
阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。
分类
ArrayBlockingQueu 是一个用数组实现的有界阻塞队列,按照先进先出的原则对元素进行排序。
public ArrayBlockingQueue(int capacity) {
this(capacity, false);
}
LinkedBlockingQueue LinkedBlockingQueue是一个用链表实现的有界阻塞队列,默认长度和最大长度为Integer.MAX_VALUE.此队列按照先进先出的原则对元素进行排序。
PriorityBlockingQueue PriorityBlockingQueue是一个支持优先级的无界阻塞队列。默认情况下元素采取自然顺序升序排列。也可以自定义类实现compareTo()方法来指定元素排序规则
DelayQueue DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityBlockingQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。
DelayQueue的应用场景
- 任务超时处理:比如下单后15分钟内未付款,自动关闭订单。