linkedblockingqueue 是 java 并发包中线程安全的链表阻塞队列,适用于生产者-消费者模型;它天然线程安全、支持阻塞操作、容量可选,常用于任务调度、日志收集等场景,并宜与 threadpoolexecutor 协同使用。

LinkedBlockingQueue 是 Java 并发包(java.util.concurrent)中一个线程安全的、基于链表实现的阻塞队列,常用于生产者-消费者模型的任务调度与解耦。它支持高并发读写,适合在多线程环境下管理异步任务。
为什么选 LinkedBlockingQueue 管理任务?
相比普通队列(如 ArrayList 或 LinkedList),LinkedBlockingQueue 天然线程安全,无需额外加锁;支持阻塞操作(如 take()、put()),能自动协调生产者和消费者节奏;容量可选(有界或无界),便于控制资源消耗。
常见适用场景包括:后台任务分发、日志收集、定时任务缓冲、RPC 请求排队等。
基本用法:创建 + 生产者 + 消费者
以一个简单的任务处理系统为例:
- 定义任务类(比如
Runnable或自定义任务对象) - 创建队列:
new LinkedBlockingQueue<runnable>()</runnable>(无界)或new LinkedBlockingQueue<runnable>(100)</runnable>(有界) - 启动多个生产者线程调用
queue.put(task)提交任务(满时阻塞) - 启动多个消费者线程调用
queue.take()获取任务(空时阻塞)
示例片段:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
LinkedBlockingQueue<runnable> taskQueue = new LinkedBlockingQueue(100);
// 生产者
new Thread(() -> {
for (int i = 0; i System.out.println("Task " + i));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}).start();
// 消费者
new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
try {
Runnable task = taskQueue.take(); // 阻塞直到有任务
task.run();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}).start();
</runnable>
关键操作与注意事项
阻塞 vs 非阻塞方法要分清:
-
put(e)和take():阻塞式,推荐用于核心任务流(避免忙等、节省 CPU) -
offer(e)和poll():非阻塞,返回true/false或null,适合需要快速失败或超时控制的场景 -
offer(e, timeout, unit)和poll(timeout, unit):带超时的阻塞,更灵活
注意容量设置:无界队列(默认构造)虽简单,但可能引发内存溢出;建议显式指定容量,并配合拒绝策略(如自行判断 offer() 返回 false 后降级处理)。
与线程池协同使用更高效
单独用 LinkedBlockingQueue 管理任务略显底层,通常搭配 ThreadPoolExecutor 使用:
- 将
LinkedBlockingQueue作为线程池的阻塞队列(通过构造函数传入) - 利用线程池自动管理消费者线程生命周期、复用、拒绝策略等
- 例如:
new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(50))
此时你只需调用 executor.submit(task),内部自动完成入队与调度,代码更简洁、健壮性更高。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










