阻塞队列通过容量限制和自动阻塞机制协调生产者与消费者节奏,应选有界队列(如arrayblockingqueue)、用put/take实现真阻塞、以队列为唯一中转站,并监控size辅助流控与诊断。

用阻塞队列控制缓冲区,核心是利用它的容量限制和自动阻塞机制,让生产者与消费者自然协调节奏,不需要手动加锁或轮询判断。
明确缓冲区大小并选择合适实现
缓冲区大小直接决定系统能承受的瞬时压力峰值。选有界队列(如 ArrayBlockingQueue 或带容量参数的 LinkedBlockingQueue)而非无界队列,避免内存无限增长。例如:
- 秒杀场景下,预估每秒最大请求约500,消费线程处理能力约300/秒,可设队列容量为1000,留出3秒左右缓冲余量
- 嵌入式设备上报属性,若MCU内存紧张,选小容量(如64或128),配合快速消费逻辑,防止OOM
用 put/take 替代 offer/poll 实现真阻塞
put 和 take 是阻塞语义的关键方法:队列满时 put 主动挂起生产者,空时 take 挂起消费者。这比非阻塞的 offer/poll + while 循环更简洁、更可靠。
- 不要写
while(!queue.offer(item)) Thread.sleep(1)—— 浪费CPU且响应滞后 - 直接调用
queue.put(item),线程会在队列满时自动等待,被唤醒后继续执行 - 同理,
queue.take()确保一定能取到元素,无需判空重试
把队列作为唯一数据中转站,隔离两端逻辑
生产者只管封装数据、调用 put;消费者只管 take、解析、执行后续动作。中间不共享变量、不互相调用、不感知对方存在。
- 比如温度传感器线程采集完数据,构造
new SensorData("temp", 25.3)后立即queue.put(...)返回 - MQTT发送线程循环
take(),拿到数据后统一做序列化、QoS封装、重试逻辑,与采集无关 - 这样修改采集频率或更换通信协议,都不影响另一端代码
监控队列水位辅助流控与诊断
队列当前长度(queue.size())是系统健康度的直观指标。它反映生产消费是否失衡,可用于动态干预。
- 若 size 长期接近容量上限,说明消费者慢了,可考虑增加消费线程数或优化处理逻辑
- 若 size 长期为0,说明生产者太慢或数据源中断,需检查上游模块
- 在日志或监控埋点中定期记录 size,比查CPU或内存更能定位瓶颈环节











