【Java多线程】阻塞队列

100 阅读1分钟

参考juejin.cn/post/684490…

什么是阻塞队列

阻塞队列是一个支持两个附加操作的队列。

  • 支持阻塞的插入方法:当队列满时,插入会阻塞插入元素的线程,直到队列不满
  • 支持阻塞的移除方法:当队列空时,移除会阻塞移除元素的线程,直到队列不空

阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。

在这里插入图片描述

分类

ArrayBlockingQueu 是一个用数组实现的有界阻塞队列,按照先进先出的原则对元素进行排序。

public ArrayBlockingQueue(int capacity) {
    this(capacity, false);
}

LinkedBlockingQueue LinkedBlockingQueue是一个用链表实现的有界阻塞队列,默认长度和最大长度为Integer.MAX_VALUE.此队列按照先进先出的原则对元素进行排序。

PriorityBlockingQueue PriorityBlockingQueue是一个支持优先级的无界阻塞队列。默认情况下元素采取自然顺序升序排列。也可以自定义类实现compareTo()方法来指定元素排序规则

DelayQueue DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityBlockingQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。

DelayQueue的应用场景

  • 任务超时处理:比如下单后15分钟内未付款,自动关闭订单。