Java阻塞队列(BlockingQueue)的使用:ArrayBlockingQueue类、LinkedBlockingQueue类
1、阻塞队列的介绍
Java 中的阻塞队列(BlockingQueue) 是多线程编程中用于协调生产者和消费者线程的重要工具,属于 java.util.concurrent 包。它的核心特点是:当队列为空时,消费者线程会被阻塞,直到队列中有新元素;当队列满时,生产者线程会被阻塞,直到队列有空闲空间。这种机制简化了线程同步的复杂性。
1.1 核心特性
- 线程安全:所有实现类默认是线程安全的,无需额外同步。
- 阻塞操作:提供 put() 和 take() 方法,分别在队列满或空时阻塞线程。
- 可选超时机制:提供 offer(e, timeout, unit) 和 poll(timeout, unit) 方法,支持在指定时间内等待操作。
- 批量操作:如 drainTo(Collection<? super E> c),批量转移队列元素到集合。
1.2 常见实现类
实现类 | 说明 |
---|---|
ArrayBlockingQueue | 基于数组的有界队列,固定容量,公平性可选(通过构造函数设置公平锁)。 |
LinkedBlockingQueue | 基于链表的队列,默认无界(容量为 Integer.MAX_VALUE),也可指定为有界。吞吐量通常高于 ArrayBlockingQueue。 |
PriorityBlockingQueue | 支持优先级排序的无界队列,元素需实现 Comparable 或提供 Comparator。 |
SynchronousQueue | 容量为 0 的队列,每个插入操作必须等待对应的移除操作(直接传递数据)。常用于线程间直接交换数据。 |
DelayQueue | 无界队列,元素需实现 Delayed 接口,只有当元素的延迟到期后才能被取出(如定时任务)。 |
选择合适的实现类:
- 需要 公平访问的有界队列 → ArrayBlockingQueue
- 需要 高吞吐的无界队列 → LinkedBlockingQueue
- 需要 按优先级处理任务 → PriorityBlockingQueue
- 需要 线程间直接传递数据 → SynchronousQueue
- 需要 定时任务调度 → DelayQueue
通过合理选择阻塞队列 BlockingQueue,可以高效解决多线程协作问题,降低手动同步的复杂性。
1.3 核心方法
方法 | 说明 |
---|---|
阻塞方法: | |
void put(E e) | 向队列尾部插入元素,若队列满则阻塞。 |
E take() | 移除并返回队列头部元素,若队列空则阻塞。 |
超时方法: | |
boolean offer(E e, |