Queue

概念

Java 里的“队列(Queue)”,核心就是 先进先出(FIFO)的一种数据结构接口体系,主要用在:任务排队、线程池、消息缓存、生产者消费者模型等

BlockingQueue

“阻塞队列(BlockingQueue)”里的“阻塞”,核心不是说队列卡住了,而是说:线程在某些条件下会被“挂起等待”,直到条件满足才继续执行。
1️⃣ “阻塞”发生在什么地方?
BlockingQueue 主要有两类操作:
👉 入队(put / offer)
队列满了
再往里放数据
👉 线程行为:
put():线程会阻塞等待空间
等别人消费了元素,有空位了,再继续放
👉 出队(take / poll)
队列空了
还要取数据
👉 线程行为:
take():线程会阻塞等待数据
直到有人放入数据才继续执行
2️⃣ “阻塞”的本质是什么?
本质是:
线程进入 WAITING / TIMED_WAITING 状态,而不是忙等(while死循环)。
BlockingQueue 的优势:
✔ 自动挂起线程 put/take
✔ 自动唤醒线程 put/take
✔ 不需要自己写 wait/notify (何时阻塞多久后可以put或take,这是自动的)
put /take 阻塞时,线程会被挂起(park/await),从“可运行队列”移除,本质是:通过 lock + condition/park,把线程从 runnable 队列移走,让 OS 调度器去跑别的线程,直到队列有空间再被唤醒继续执行
把阻塞理解成挂起让出cpu执行权,更容易理解吧,节省cpu资源提高系统运行效率。

集合和队列的区别?

集合用于“存储和管理数据”,强调数据结构本身;
队列用于“控制数据处理顺序”,强调生产者-消费者协作和并发执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容