点赞关注,不再迷路,你的支持对我意义重大!
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
创作不易,你的「三连」是丑丑最大的动力,我们下次见!