「Java 路线」| 阻塞队列

点赞关注,不再迷路,你的支持对我意义重大!

Hi,我是丑丑。本文 「Java 路线」| 导读 —— 他山之石,可以攻玉 已收录,这里有 Android 进阶成长路线笔记 & 博客,欢迎跟着彭丑丑一起成长。(联系方式在 GitHub)


前言

  • 队列 是先进先出(FIFO—first in first out)线性表,而 阻塞队列 则是支持阻塞地「入队」或「出队」的队列,阻塞队列最常见的应用场景是线程池。
  • 在这篇文章里,我将分析 阻塞队列的原理 & 实现,如果能帮上忙,请务必点赞加关注,这真的对我非常重要。

目录


1. 前置知识

  • 中断?等待?

2. 什么是阻塞队列

阻塞队列(BlockingQueue)是支持阻塞地「入队」或「出队」的队列:

  • 1、支持阻塞地入队: 当队列满时,入队会阻塞,直到队列不满或中断。
  • 2、支持阻塞地出队: 当队列为空时,出队会阻塞,直到队列非空或中断。

应用场景: 解决生产者和消费者强耦合以及盛昌消费能力不均衡的问题。


2. 阻塞队列的基本操作

BlockingQueue 中并不是每一个方法都会阻塞,具体总结如下:

用途 抛出异常 返回特殊值 阻塞,超时退出 阻塞
入队 add(e) offer(e) offer(e,time,unit) put(e)
出队 remove() poll() poll(time,unit) take()
检查队头 element() peek() / /
  • 抛出异常: 当队列满时,入队会抛出IllegalStateException 异常。当队列空时,出队/检查会抛出 NoSuchElementException 异常;
  • 返回特殊值: 当队列满时,入队会返回 false。当队列空时,出队/检查会返回 null;
  • 超时退出:阻塞 类似,增加超时退出;
  • 阻塞: 当队列满时,入队会阻塞,直到队列非满或者中断。当队列空时,出队会阻塞,直到队列非空或者中断。

3. 阻塞队列实现

•ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
•LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
•PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
•DelayQueue:一个使用优先级队列实现的无界阻塞队列。
•SynchronousQueue:一个不存储元素的阻塞队列。
•LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
•LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

BlockingDeque



创作不易,你的「三连」是丑丑最大的动力,我们下次见!

你可能感兴趣的:(「Java 路线」| 阻塞队列)