DelayQueue 是无界阻塞队列,基于最小堆实现延迟任务调度,需元素实现 Delayed 接口,依赖主动 take() 消费,无持久化、不支持分布式,仅适用于单机轻量场景。

Java 的 DelayQueue 是一个无界阻塞队列,适合处理带延迟的定时任务,比如订单超时未支付自动取消。但它不是为高并发、持久化、分布式场景设计的,用在订单超时上要特别注意适用边界。
DelayQueue 的核心机制
DelayQueue 要求元素实现 Delayed 接口,必须提供 getDelay(TimeUnit)(剩余延迟时间)和 compareTo()(用于堆排序)。队列内部用优先队列(最小堆)维护,头部永远是最早到期的元素。
它本身不启动线程,需要你主动调用 take() 或 poll() 来获取已到期任务——典型用法是配一个单独的消费者线程不断 take(),拿到就执行取消逻辑。
简单订单超时示例(单机轻量场景)
适合小流量、非关键业务(如测试环境、内部工具订单):
立即学习“Java免费学习笔记(深入)”;
- 定义订单延迟对象,包含订单ID、创建时间、超时毫秒数
-
getDelay()返回triggerTime - System.currentTimeMillis()(注意负数表示已过期) - 启动一个守护线程,循环
delayQueue.take(),拿到即调用取消服务 - 下单时把该对象
offer()进队列即可
⚠️ 注意:JVM 崩溃或重启,所有未处理的 DelayQueue 元素会丢失,无法恢复。
标签: java redis 工具 金融 分布式部署 red
还木有评论哦,快来抢沙发吧~