目录
1.阻塞队列是什么
阻塞队列(Blocking Queue)是一种特殊类型的队列,它在插入和删除元素时可以提供阻塞机制。阻塞队列能是⼀种线程安全的数据结构, 并且具有以下特性:
当队列满的时候, 继续⼊队列就会阻塞, 直到有其他线程从队列中取⾛元素.当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插⼊元素.
生产者-消费者模型
阻塞队列的⼀个典型应⽤场景就是 "⽣产者消费者模型". 这是⼀种⾮常典型的开发模型. ⽣产者消费者模式就是通过⼀个容器来解决⽣产者和消费者的强耦合问题。 ⽣产者和消费者彼此之间不直接通讯,⽽通过阻塞队列来进⾏通讯,所以⽣产者⽣产完数据之后不⽤ 等待消费者处理,直接扔给阻塞队列,消费者不找⽣产者要数据,⽽是直接从阻塞队列⾥取.
1. 阻塞队列就相当于⼀个缓冲区,平衡了⽣产者和消费者的处理能⼒. (削峰填⾕)
就像三峡大坝一样。它是为了抵御突然的洪水修建的。洪水突然来临的时候,三峡大坝可以缓解巨大的洪水量,将它储蓄起来。经过三峡大坝缓冲后,流到下流的水就不会特别大。当长时间干旱没有下雨的时候,三峡大坝就可以开闸放水,来填补。
2. 阻塞队列也能使⽣产者和消费者之间 解耦
⽐如过年⼀家⼈⼀起包饺⼦. ⼀般都是有明确分⼯, ⽐如⼀个⼈负责擀饺⼦⽪, 其他⼈负责包. 擀饺⼦⽪的⼈就是 "⽣产者", 包饺⼦的⼈就是 "消费者". 擀饺⼦⽪的⼈不关⼼包饺⼦的⼈是谁(能包就⾏, ⽆论是⼿⼯包, 借助⼯具, 还是机器包), 包饺⼦的⼈也 不关⼼擀饺⼦⽪的⼈是谁(有饺⼦⽪就⾏, ⽆论是⽤擀⾯杖擀的, 还是拿罐头瓶擀, 还是直接从超市买的)
2.标准库中的阻塞队列
在 Java 标准库中内置了阻塞队列. 如