队列(阻塞队列、非阻塞队列)的详解
队列的详解
什么是队列?
用来存储一条条消息(线程)的容器是一个对列。 队列是一种特殊的线性表,遵循先入先出、后入后出的基本原则
什么是阻塞队列,什么是非阻塞队列?
阻塞队列:
添加元素时,超过总数则会进行等待(阻塞)。删除元素时,队列为空则会进行等待(阻塞)。
非阻塞队列 :
不管什么情况下都不会阻塞。
阻塞队列都实现了 BlockingQueue接口
什么是有界队列,什么是无界队列?
有界:
有界限,大小长度受限制
无界 :
无限大小,其实说是无限大小,其实是有界限的,只不过超过界限时就会进行扩容,就行ArrayList 一样,在内部动态扩容
单向链表和双向链表
单向链表 :
每个元素中除了元素本身之外,还存储一个指针,这个指针指向下一个元素;。
双向链表 :
除了元素本身之外,还有两个指针,一个指针指向前一个元素的地址,另一个指针指向后一个元素的地址 。
队列常用方法
方法 | 作用 | |
---|---|---|
add | 添加一个元素,返回true | 如果队列已满,则抛出异常IllegalStateException |
remove | 移除队列头部元素,并返回该元素值 | 如果队列为空,则会抛出NoSuchElementException |
element | 获取队列头部元素 | 如果队列为空,则会抛出NoSuchElementException |
offer | 添加一个元素,返回true | 如果队列已满,则返回false |
poll | 移除队列头部元素,并返回该元素值 | 如果队列已满,则返回false |
peek | 获取队列头部元素 | 如果队列已满,则返回false |
put | 添加一个元素 | 如果队列满,则阻塞 |
take | 移除队列头部元素,并返回该元素值 | 如果队列满,则阻塞 |
阻塞队列:
ArrayBlockingQueue: 数组结构组成的有界阻塞队列
LinkedBlockingQueue:链表结构组成的有界阻塞队列
SynchronousQueue:不存储元素的阻塞队列,直接提交给线程不保存它们
PriorityBlockingQueue:支持优先级排序的无界阻塞队列
DelayQueue:使用优先级队列实现的无界阻塞队列,只有在延迟期满时才能从中提取元素
LinkedTransferQueue:由链表结构组成的无界阻塞队列。与SynchronousQueue类似,还含有非阻塞方法
LinkedBlockingDeque:由链表结构组成的双向阻塞队列
非阻塞队列:
ConcurrentLinkedQueue:单向链表结构的无界并发队列, 非阻塞队列,由CAS实现线程安全,内部基于节点实现
ConcurrentLinkedDeque:双向链表结构的无界并发队列, 非阻塞队列,由CAS实现线程安全
PriorityQueue:内部基于数组实现,线程不安全的队列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?