scheduledthreadpoolexecutor是java并发包中专用于定时和周期性任务的线程池,继承threadpoolexecutor并实现scheduledexecutorservice接口;它基于delayedworkqueue(最小堆优先队列)按触发时间排序任务,支持schedule(单次延迟)、schedulewithfixeddelay(固定延迟重复)、scheduleatfixedrate(固定速率重复)三种调度模式,具备多线程、异常隔离、精准调度等优势,全面替代timer。

ScheduledThreadPoolExecutor 是 Java 并发包中专门用于调度定时和周期性任务的线程池,比 Timer 更可靠、更灵活,也比直接用 ThreadPoolExecutor + Future 手动控制时间更简洁。它底层基于堆(优先队列)管理任务触发时间,支持延迟执行、固定延迟重复、固定速率重复三种核心调度模式。
延迟执行单次任务:schedule(Runnable, delay, unit)
适用于“几秒后做一次”的场景,比如发送延时通知、清理临时缓存等。任务只执行一次,不自动重试。
- 传入
Runnable或Callable,后者可返回结果并捕获异常 -
delay是从当前调用时刻起算的等待时间,不是绝对时间点 - 若线程池已 shutdown,任务会被拒绝(抛
RejectedExecutionException) - 示例:executor.schedule(() -> System.out.println("3秒后执行"), 3, TimeUnit.SECONDS);
固定延迟重复执行:scheduleWithFixedDelay(Runnable, initialDelay, delay, unit)
每次执行完后,等待指定延迟再启动下一次——执行耗时会影响下次开始时间。适合对“两次执行间隔”有明确下限、且不希望任务堆积的场景,如健康检查、状态轮询。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
initialDelay是首次执行前的等待时间 -
delay是上一次执行 结束 到下一次执行 开始 的间隔 - 如果某次执行异常,后续调度不会中断,但异常不会自动传播,需在任务内处理
- 示例:executor.scheduleWithFixedDelay(this::fetchStatus, 2, 10, TimeUnit.SECONDS);(首次2秒后执行,之后每次执行完等10秒再执行)
固定速率重复执行:scheduleAtFixedRate(Runnable, initialDelay, period, unit)
按固定时间节奏推进,不管上次是否执行完——即使某次执行超时,下一次仍会在预定时刻触发(可能并发执行)。适合数据采集、心跳上报等强时效性任务。
-
period是两次执行 开始时刻 的间隔 - 若任务执行时间 >
period,后续任务会排队或并发(取决于线程池大小),不会跳过 - 线程池满载时,新任务将被拒绝策略处理(默认
AbortPolicy) - 示例:executor.scheduleAtFixedRate(this::sendHeartbeat, 0, 5, TimeUnit.SECONDS);(立即开始,之后每5秒准时发起一次心跳)
任务取消与生命周期管理
所有 schedule 方法都返回 ScheduledFuture,它是 Future 的子接口,支持取消和查询状态。
- 调用
future.cancel(true)可中断正在运行的任务(前提是任务响应中断) -
future.isDone()和future.isCancelled()可判断任务终态 - 务必在应用关闭前调用
shutdown()或shutdownNow(),否则 JVM 无法退出 - 建议配合
try-with-resources或 Spring 的@PreDestroy做优雅停机
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










