WMX · 随记
·Java· 3 分钟阅读

BlockingQueue:容量满时,让生产者感知压力

生产者持续快于消费者时,无限增加队列只会把问题从处理速度转移到内存。缓冲需要上限,也需要满载行为。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

生产者持续快于消费者时,无限增加队列只会把问题从处理速度转移到内存。缓冲需要上限,也需要满载行为。

理解核心机制

有界阻塞队列可以通过 put 等待空间,也能使用 offer 快速返回或限时等待。选择哪一种取决于调用线程能否阻塞,以及上层如何处理无法接收的任务。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java9 行 · 可横向滚动
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 定义明确的拒绝或重试预算。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档