任务执行漏斗通过三级阻塞队列实现流量缓冲、分拣与节流:第一级入口缓冲承接洪峰,第二级按优先级分组调度,第三级令牌桶或SynchronousQueue控制输出速率,并协同解决唤醒丢失、背压传导和生命周期一致性问题。

任务执行漏斗的核心,是把突发、不均的任务流量,通过多级阻塞队列(BlockingQueue)逐层缓冲、限速、整形,最终以稳定节奏交付给执行单元。它不是简单堆叠队列,而是按“入口接收 → 优先级分拣 → 容量控制 → 速率节制”逻辑组织的分级处理链。
第一级:无界/大容量接收队列(入口缓冲)
这一级负责承接上游所有瞬时洪峰,避免任务直接丢弃或压垮提交线程。常用 LinkedBlockingQueue(默认无界)或指定较大容量的 ArrayBlockingQueue。关键点在于:
- 不在此级做耗时判断(如权限校验、参数解析),只做轻量入队
- 若使用有界队列,需配置合理的拒绝策略(如丢弃最老任务或抛异常),防止生产者线程无限阻塞
- 可搭配监控指标(如队列长度、入队耗时),作为下游压力预警信号
第二级:按优先级/类型分离的队列组(分类调度)
单一队列无法兼顾紧急任务与后台任务。实际做法是用多个 BlockingQueue 构成逻辑分组,例如:
- HighPriorityQueue:存放支付确认、风控拦截等低延迟任务,消费者线程独占或高权重调度
- NormalQueue:常规业务请求,由共享线程池消费
- LowPriorityQueue:日志归档、报表生成等,允许延迟且可被动态降级
注意:各队列间不共享锁,但需统一管理唤醒逻辑,避免因某一级空闲导致其他级任务“饿死”。
第三级:带速率控制的输出队列(平滑输出)
这一级决定最终执行节奏。不能依赖线程池自动限速(易受 corePoolSize 和队列策略干扰),而应主动引入节流机制:
- 用 SynchronousQueue + 固定大小线程池,强制每任务一对一绑定线程,天然限制并发数
- 或在普通队列后加一层“令牌桶”代理:消费者线程先从令牌桶取令牌,再从队列取任务;令牌以恒定速率注入,实现严格漏桶式输出
- 也可用 DelayQueue 实现微秒级延迟重排队,把密集任务人为打散成均匀间隔
关键协同细节
多级队列不是孤立运行,必须处理好三类耦合问题:
-
唤醒丢失(Lost Wakeup):生产者入队后必须在释放锁前或紧随其后调用
signal()或notifyAll(),否则消费者可能永远等待 - 背压传导:当第三级满载时,需反向通知第二级减缓投递,甚至触发第一级拒绝策略,形成闭环反馈
- 任务生命周期一致性:同一任务在各级队列中应保持唯一标识与状态可追溯,便于超时清理、重试追踪和失败回滚

















