精通 Java LinkedBlockingQueue:全面指南与实战示例
Java LinkedBlockingQueue
探索 LinkedBlockingQueue 类、其核心方法及实战示例,解锁 Java 中的线程安全队列。
LinkedBlockingQueue 类位于 Java java.util.concurrent 包,实现基于链表的阻塞队列。它遵循 BlockingQueue 接口,为并发生产者-消费者场景提供健壮、线程安全的结构。

创建 LinkedBlockingQueue
使用前导入 java.util.concurrent.LinkedBlockingQueue:
import java.util.concurrent.LinkedBlockingQueue;
1. 不指定初始容量
LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>();
默认容量为 Integer.MAX_VALUE (231–1),实际上无界。
2. 指定容量
LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>(int capacity);
Type— 元素类型(如String、Integer)capacity— 队列最大容纳元素数
示例:
// 容量 5 的 String 队列
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
// 容量 5 的 Integer 队列
LinkedBlockingQueue<Integer> ages = new LinkedBlockingQueue<>(5);
注意: 容量可选;省略则创建无界队列。
LinkedBlockingQueue 的关键方法
该类实现所有 BlockingQueue 方法,支持插入、获取、移除元素。其中 put() 和 take() 提供阻塞行为,区别于普通队列。
插入元素
add(E e)— 添加元素,满时抛异常。offer(E e)— 添加元素,满时返回false。
示例:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
animals.add("Dog");
animals.add("Cat");
animals.offer("Horse");
System.out.println("LinkedBlockingQueue: " + animals);
}
}
输出
LinkedBlockingQueue: [Dog, Cat, Horse]
访问元素
peek()— 获取但不移除队头;空时返回null。iterator()— 提供队列的快速安全迭代器。需导入java.util.Iterator。
示例:
import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("LinkedBlockingQueue: " + animals);
String head = animals.peek();
System.out.println("访问的元素: " + head);
Iterator<String> it = animals.iterator();
System.out.print("LinkedBlockingQueue 元素: ");
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
}
}
输出
LinkedBlockingQueue: [Dog, Cat, Horse] 访问的元素: Dog LinkedBlockingQueue 元素: Dog, Cat, Horse,
移除元素
remove()— 移除并返回队头;空时抛异常。poll()— 移除并返回队头;空时返回null。clear()— 清空所有元素。
示例:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("LinkedBlockingQueue: " + animals);
String removed = animals.remove();
System.out.println("remove(): " + removed);
String polled = animals.poll();
System.out.println("poll(): " + polled);
animals.clear();
System.out.println("更新后的 LinkedBlockingQueue: " + animals);
}
}
输出
LinkedBlockingQueue: [Dog, Cat, Horse] remove(): Dog poll(): Cat 更新后的 LinkedBlockingQueue: []
阻塞操作:put() 与 take()
在并发场景下,put() 和 take() 阻塞调用线程直到操作可进行,安全协调生产者与消费者。
put()
在尾部插入元素,队列满时等待。
示例:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
try {
animals.put("Dog");
animals.put("Cat");
System.out.println("LinkedBlockingQueue: " + animals);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println(e.getMessage());
}
}
}
输出
LinkedBlockingQueue: [Dog, Cat]
take()
获取并移除队头元素,队列空时阻塞。
示例:
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
try {
animals.put("Dog");
animals.put("Cat");
System.out.println("LinkedBlockingQueue: " + animals);
String removed = animals.take();
System.out.println("移除的元素: " + removed);
System.out.println("新 LinkedBlockingQueue: " + animals);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println(e.getMessage());
}
}
}
输出
LinkedBlockingQueue: [Dog, Cat] 移除的元素: Dog 新 LinkedBlockingQueue: [Cat]
其他实用方法
| 方法 | 说明 |
|---|---|
contains(Object o) | 判断队列是否包含指定元素 |
size() | 返回当前元素数量 |
toArray() | 转换为数组 |
toString() | 队列的字符串表示 |
为何选择 LinkedBlockingQueue?
因其内部使用链表,LinkedBlockingQueue 提供:
- 开箱即用的线程安全。
- 可选有界容量以实现背压控制。
- 阻塞方法自然协调生产者与消费者。
在多线程应用中,若生产者比消费者慢,队列会自动挂起消费者直到新项到达,防止忙等待并降低 CPU 开销。
对于高性能并发工作负载,Java 并发 API 推荐 LinkedBlockingQueue 作为生产者-消费者管道的首选结构。
---
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- Java break 语句:用法、时机与标签 break 详解
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比