阻塞队列有几种(阻塞队列有哪几种)

阻塞队列有几种(阻塞队列有哪几种)阻塞队列用于保存等待执行的任务 当任务的数量超过 corePoolSize 数量 后续的任务将会进入阻塞队列 阻塞排队 有以下几种阻塞队列 是一个基于数组结构的有界阻塞队列 此队列按 FIFO 先进先出 原则对元素进行排序 ArrayBlockin 是一个用数组实现的有界阻塞队列 队列慢时插入操作被阻塞 队列空时 移除操作被阻塞 按照先进先出 FIFO 原则对元素进行排序

大家好,我是讯享网,很高兴认识大家。



阻塞队列用于保存等待执行的任务。当任务的数量超过 corePoolSize 数量,后续的任务将会进入阻塞队列,阻塞排队。

有以下几种阻塞队列:

是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。


讯享网

  • ArrayBlockingQueue是一个用数组实现的有界阻塞队列。
  • 队列慢时插入操作被阻塞,队列空时,移除操作被阻塞。
  • 按照先进先出(FIFO)原则对元素进行排序。
  • 默认不保证线程公平的访问队列。
  • 公平访问队列:按照阻塞的先后顺序访问队列,即先阻塞的线程先访问队列。
  • 非公平性是对先等待的线程是非公平的,当队列可用时,阻塞的线程都可以争夺访问队列的资格。有可能先阻塞的线程最后才访问访问队列。
  • 公平性会降低吞吐量。

一个基于链表结构的阻塞队列,此队列按 FIFO 排序元素,吞吐量通常要高于 ArrayBlockingQueue。静态工厂方法 Executors.newFixedThreadPool() 使用了这个队列。(newFixedThreadPool 用于创建固定线程数)

图片LinkedBlockingQueue 原理

  • LinkedBlockingQueue具有单链表和有界阻塞队列的功能。
  • 队列慢时插入操作被阻塞,队列空时,移除操作被阻塞。
  • 默认和最大长度为Integer.MAX_VALUE,相当于无界(值非常大:2^31-1)。

一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于 LinkedBlockingQueue,静态工厂方法 Executors.newCachedThreadPool 使用这个队列。(newCachedThreadPool 用于根据需要创建新线程)

SynchronousQueue 原理

  • 我称SynchronousQueue为”传球好手“。想象一下这个场景:小明抱着一个篮球想传给小花,如果小花没有将球拿走,则小明是不能再拿其他球的。
  • SynchronousQueue负责把生产者产生的数据传递给消费者线程。
  • SynchronousQueue本身不存储数据,调用了put方法后,队列里面也是空的。
  • 每一个put操作必须等待一个take操作完成,否则不能添加元素。
  • 适合传递性场景。
  • 性能高于ArrayBlockingQueue 和 LinkedBlockingQueue。

一个具有优先级的无限阻塞队列。

PriorityBlockQueue的原理图

  • PriorityBlockQueue = PriorityQueue + BlockingQueue
  • 之前我们也讲到了PriorityQueue的原理,支持对元素排序。
  • 元素默认自然排序。
  • 可以自定义CompareTo()方法来指定元素排序规则。
  • 可以通过构造函数构造参数Comparator来对元素进行排序。

之前写过一篇文章:干货 | 45张图庖丁解牛18种Queue,你知道几种?

小讯
上一篇 2025-06-07 11:36
下一篇 2025-06-09 09:14

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/174415.html