ArrayBlockingQueue入队操作有add、offer、put和带超时的offer四种方式:add失败抛异常;offer失败返回false;put阻塞直至成功;带超时offer最多等待指定时间后返回结果。

ArrayBlockingQueue 是 Java 并发包(java.util.concurrent)中一个基于数组实现的有界阻塞队列。它的入队操作(即向队尾添加元素)有多种方式,核心区别在于**是否阻塞、是否抛异常、是否超时等待**。
add(E e):失败直接抛异常
尝试将元素加入队尾,如果队列已满,立即抛出 IllegalStateException("Queue full")。适合明确要求“必须成功或快速失败”的场景。
offer(E e):失败返回 false
尝试入队,成功返回 true,队满则返回 false,不阻塞也不抛异常。最常用、最安全的非阻塞入队方式。
- 适合需要主动控制流程的场景,比如做重试、降级或记录日志
- 示例:
if (!queue.offer(task)) { log.warn("队列已满,丢弃任务: " + task); }
put(E e):阻塞直到成功
将元素加入队尾;如果队列已满,当前线程会**一直阻塞**,直到有空间可用(其他线程出队腾出位置)。适用于“必须入队,且能接受等待”的业务逻辑。
立即学习“Java免费学习笔记(深入)”;
weiit-saas是一款Java开源项目,由weiit团队自研,意在通过技术封装,帮助企业一键生成小程序、公众号,让企业拥有独立品牌的自营商城。weiit-saas是完全开源电商SaaS系统,属于weiit开源的社区版,旧版已不在维护和更新,仅供学习和参考,新版saas从底层架构到前后端UI设计已经全面优化和升级。 主要特点1、项目采用Spring+SpringMVC+Mybatis主流开源框架
offer(E e, long timeout, TimeUnit unit):带超时的阻塞入队
尝试入队,若队满则最多等待指定时间;超时前获得空位则成功返回 true,超时仍未入队则返回 false。
- 平衡了可靠性与响应性,避免无限等待
- 示例:
queue.offer(task, 2, TimeUnit.SECONDS)
本质上,ArrayBlockingQueue 的入队都遵循“先检查容量 → 写入数组 → 更新尾指针 → 唤醒等待的消费者”这一流程。由于底层是固定大小数组,所有入队操作的时间复杂度都是 O(1),但线程安全性由内置的 ReentrantLock 保证。
基本上就这些 —— 选哪个方法,取决于你对失败处理、响应时间和线程模型的要求。










