BlockingQueue是Java并发包中专为生产者-消费者设计的线程安全阻塞队列,满时生产者阻塞、空时消费者阻塞;常用实现包括ArrayBlockingQueue(有界数组)、LinkedBlockingQueue(链表,高吞吐)、PriorityBlockingQueue(优先级)和SynchronousQueue(不存储,手递手传递)。

BlockingQueue 是 Java 并发包(java.util.concurrent)中一个关键的线程安全队列接口,专为**生产者-消费者场景**设计。它的核心特点是:当队列满时,生产者线程会阻塞等待空间;当队列空时,消费者线程会阻塞等待元素。不用手动加锁或调用 wait/notify,就能安全高效地实现线程间协作。
Java 提供了多个 BlockingQueue 的实现,选对实现很重要:
Integer.MAX_VALUE),也可指定容量。吞吐量通常高于 ArrayBlockingQueue,适合高并发、元素数量波动大的情况。Comparable 或传入 Comparator。注意:它不保证完全按优先级“即时”消费,但出队总遵循优先级顺序。Executors.newCachedThreadPool() 内部使用)。BlockingQueue 定义了三套行为不同的方法,对应不同容错需求:
put(E e)(满则阻塞)、take()(空则阻塞)——最常用,逻辑简洁,适合不希望丢数据、能接受等待的场景。offer(E e, long timeout, TimeUnit unit)、poll(long timeout, TimeUnit unit)——指定时间内尝试操作,超时返回 false 或 null。适合需要控制等待上限、避免无限挂起的系统(如实时性要求高的服务)。add(E e)、remove()、element()——队列满或空时直接抛 IllegalStateException 或 NoSuchElementException。一般不推荐在多线程中直接使用,因无法应对并发下的状态瞬变。用 LinkedBlockingQueue 实现一个简单但完整的例子:
立即学习“Java免费学习笔记(深入)”;
定义队列:
BlockingQueue
生产者(模拟生成任务):
new Thread(() -> {
for (int i = 0; i
try {
queue.put("task-" + i);
System.out.println("Produced: task-" + i);
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}).start();
消费者(模拟处理任务):
new Thread(() -> {
while (true) {
try {
String task = queue.take(); // 空则阻塞
System.out.println("Consumed: " + task);
TimeUnit.MILLISECONDS.sleep(200); // 模拟处理耗时
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}).start();
几个容易踩坑的点:
iterator())不保证强一致性——可能看到部分更新或重复元素,仅适合调试,不要依赖其结果做业务判断。take() 会一直阻塞,如果消费者线程需优雅退出,建议配合 poll(timeout, unit) + 循环条件,或用中断机制响应 shutdown。SynchronousQueue 容量为 0,size() 永远返回 0,不能用它判断是否有待处理任务。基本上就这些。BlockingQueue 把复杂的线程协调封装得非常干净,用好它,比手写 wait/notify 稳定得多,也比自己加锁更不容易出错。
以上就是BlockingQueue在java中的使用的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号