在电商秒杀系统中,瞬时涌入的10万请求如果直接冲击数据库,必然导致系统崩溃。阻塞队列如同一个智能缓冲带,通过流量削峰和异步解耦两大核心能力,成为高并发系统的核心组件。
队列实现类 | 数据结构 | 锁机制 | 适用场景 | 吞吐量 |
---|---|---|---|---|
ArrayBlockingQueue | 数组 | 单锁ReentrantLock | 固定容量场景 | 中 |
LinkedBlockingQueue | 链表 | 双锁分离 | 高吞吐量生产消费 | 高 |
PriorityBlockingQueue | 堆 | 单锁ReentrantLock | 优先级任务调度 | 低 |
SynchronousQueue | 无缓冲 | CAS+自旋 | 直接传递任务 | 极高 |
DelayQueue | 优先级堆 | 单锁ReentrantLock | 定时任务调度 | 低 |
方法类型 | 抛出异常 | 返回特殊值 | 阻塞等待 | 超时等待 |
---|---|---|---|---|
插入 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
移除 | remove() | poll() | take() | poll(time, unit) |
检查 | element() | peek() | 不支持 | 不支持 |
public class ArrayBlockingQueue<E> extends AbstractQueue<E> {
final Object[] items;
int takeIndex;
int putIndex;
final ReentrantLock lock;
private final Condition notEmpty;
private final Condition notFull;
public void put(E e) throws InterruptedException {
Objects.requireNonNull(e);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == items.length)
notFull.await();
enqueue(e);
} finally {
lock.unlock();
}
}
}
// 创建阻塞队列
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);
// 自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60, TimeUnit.SECONDS,
queue,
new CustomThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy()
);
// 提交任务
executor.submit(() -> {
// 业务处理逻辑
processOrder(order);
});
public class OrderProcessor {
private final BlockingQueue<Order> queue = new LinkedBlockingQueue<>(1000);
// 生产者线程
public void receiveOrder(Order order) throws InterruptedException {
queue.put(order);
log.info("订单已接收:{}", order.getId());
}
// 消费者线程池
@PostConstruct
public void startConsumers() {
Executors.newFixedThreadPool(5).submit(() -> {
while (true) {
try {
Order order = queue.take();
processOrder(order);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
});
}
private void processOrder(Order order) {
// 订单处理核心逻辑
}
}
public class DelayOrderManager {
private final DelayQueue<DelayedOrder> queue = new DelayQueue<>();
// 添加延时订单
public void addOrder(Order order, long delayMinutes) {
queue.put(new DelayedOrder(order, delayMinutes));
}
// 延时任务处理
@PostConstruct
public void startCancelTask() {
Executors.newSingleThreadExecutor().submit(() -> {
while (!Thread.currentThread().isInterrupted()) {
try {
DelayedOrder delayedOrder = queue.take();
cancelOrder(delayedOrder.getOrder());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
}
static class DelayedOrder implements Delayed {
private final Order order;
private final long expireTime;
// 实现getDelay()和compareTo()
}
}
场景特征 | 推荐队列 | 理由 |
---|---|---|
固定容量内存控制 | ArrayBlockingQueue | 数组结构内存占用可控 |
高吞吐量生产消费 | LinkedBlockingQueue | 双锁分离提升并发性能 |
任务需要优先级调度 | PriorityBlockingQueue | 内置堆结构实现优先级 |
严格顺序传递 | SynchronousQueue | 实现生产者消费者直接握手 |
问题1:队列积压导致内存溢出
queue.size()
问题2:消费者处理速度慢
List<Order> batch = new ArrayList<>(100);
queue.drainTo(batch, 100);
processBatch(batch);
问题3:线程阻塞无法终止
while (!Thread.currentThread().isInterrupted()) {
Order order = queue.poll(1, TimeUnit.SECONDS);
if (order != null) process(order);
}
现代异步编程框架往往基于阻塞队列思想演进:
核心优势:
使用原则:
扩展方向:
推荐阅读:
掌握阻塞队列,让您的并发程序如虎添翼!