1. Java ScheduledThreadPoolExecutor 的堆实现与延迟队列局限
Java ScheduledThreadPoolExecutor 的堆实现与延迟队列有哪些局限?
- 延迟队列(DelayQueue)
- 堆实现
- 局限
ScheduledThreadPoolExecutor 用 DelayQueue 存任务,基于堆(优先队列)按到期时间排序,take 时阻塞等待最早到期任务。局限:堆实现的插入/删除 O(log n),大量任务(百万级)时入队出队开销大;单个队列的锁竞争在并发下是瓶颈;任务到期后由 worker 线程取出执行,调度精度受系统时钟与线程池影响;大规模延迟任务时,堆的 O(log n) 与全局锁导致性能下降。因此对超大规模延迟任务,常用时间轮(O(1) 入队)替代。认识局限利于选型调度器。
延迟队列用堆 O(log n) 排序 + 全局锁,百万级任务性能受限。时间轮 O(1) 入队是替代方案。理解局限做调度选型。