BlockingQueue:容量满时,让生产者感知压力
生产者持续快于消费者时,无限增加队列只会把问题从处理速度转移到内存。缓冲需要上限,也需要满载行为。
问题从哪里出现
生产者持续快于消费者时,无限增加队列只会把问题从处理速度转移到内存。缓冲需要上限,也需要满载行为。
理解核心机制
有界阻塞队列可以通过 put 等待空间,也能使用 offer 快速返回或限时等待。选择哪一种取决于调用线程能否阻塞,以及上层如何处理无法接收的任务。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
import java.util.concurrent.ArrayBlockingQueue;
public class Demo {
public static void main(String[] args) throws Exception {
var queue = new ArrayBlockingQueue<String>(1);
System.out.println(queue.offer("first"));
System.out.println(queue.offer("second"));
System.out.println(queue.take());
}
}适用边界与常见误区
队列有界不等于整个系统有界,生产者可能在其他位置保留了大量任务。关闭信号、超时和中断也需要组成完整协议。
继续练习
让消费者暂时停止,观察 put 与 offer 的不同;给失败的 offer 定义明确的拒绝或重试预算。