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免费学习笔记(深入)”;
jQuery鼠标经过方形图片切换成圆边特效,点击图片会弹出浮层,适合团队页面的展示,兼容主流浏览器,php中文网推荐下载! 使用方法: 1、在head区域引入样式表文件lrtk.css 2、在head区域引入jquery-1.7.1.js 3、在你的网页中加入注释区域代码即可。
offer(E e, long timeout, TimeUnit unit):带超时的阻塞入队
尝试入队,若队满则最多等待指定时间;超时前获得空位则成功返回 true,超时仍未入队则返回 false。
- 平衡了可靠性与响应性,避免无限等待
- 示例:
queue.offer(task, 2, TimeUnit.SECONDS)
本质上,ArrayBlockingQueue 的入队都遵循“先检查容量 → 写入数组 → 更新尾指针 → 唤醒等待的消费者”这一流程。由于底层是固定大小数组,所有入队操作的时间复杂度都是 O(1),但线程安全性由内置的 ReentrantLock 保证。
基本上就这些 —— 选哪个方法,取决于你对失败处理、响应时间和线程模型的要求。










