2026/4/6 5:02:01
网站建设
项目流程
一、本质区别TimerJDK 1.3 就有的单线程定时任务内部只有一个线程轮流执行所有任务基于绝对系统时间System.currentTimeMillis()ScheduledExecutorServiceJDK 1.5JUC 并发包提供线程池多个线程执行任务基于相对时间纳秒不依赖系统时间任务之间完全隔离二、核心缺陷对比1. Timer 单线程一个任务卡死全部任务卡死2. Timer 任务抛出未捕获异常 → 整个 Timer 直接死亡3. Timer 依赖系统时间改时间会导致任务执行异常4. ScheduledExecutorService 完全解决以上所有问题三、代码案例对比① Timer 代码示例import java.util.Timer; import java.util.TimerTask; public class TimerTest { public static void main(String[] args) { Timer timer new Timer(); // 任务1正常执行 timer.scheduleAtFixedRate(new TimerTask() { Override public void run() { System.out.println(任务1执行); } }, 0, 1000); // 任务210秒后抛异常 timer.schedule(new TimerTask() { Override public void run() { System.out.println(任务2抛出异常); // Timer 只要有一个任务抛异常整个Timer线程死亡所有任务停止 throw new RuntimeException(异常); } }, 3000); } }运行结果任务 1 执行几次 → 任务 3 秒后抛异常 →整个程序所有定时任务全部停止② ScheduledExecutorService 代码示例import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledTest { public static void main(String[] args) { // 核心线程池2个 ScheduledExecutorService executor Executors.newScheduledThreadPool(2); // 任务1正常执行 executor.scheduleAtFixedRate(() - { System.out.println(任务1执行); }, 0, 1, TimeUnit.SECONDS); // 任务23秒后抛异常 executor.schedule(() - { System.out.println(任务2抛出异常); throw new RuntimeException(异常); }, 3, TimeUnit.SECONDS); } }运行结果任务 2 抛出异常只影响自己任务 1永远继续执行ScheduledExecutorServiceJava 1.5 提供的 **** 线程池风格的定时任务工具用来替代旧的Timer。父接口是ExecutorService所以本质就是一个支持延迟 / 周期性执行的线程池。常用方法schedule(Runnable, delay, unit)延迟一段时间执行一次scheduleAtFixedRate(Runnable, initialDelay, period, unit)固定速率执行每隔 period 执行一次不关心任务执行时长scheduleWithFixedDelay(Runnable, initialDelay, delay, unit)固定间隔执行任务执行结束后再等 delay 才执行下一次schedule(Callable...)延迟执行并带返回值最核心区别FixedRate固定频率每隔固定时间启动一次任务执行时间长会导致任务挤堆、并发执行。FixedDelay固定延迟任务结束 → 等延迟 → 再执行下一次任务之间一定有固定空闲时间。优点对比 TimerTimer 是单线程一个任务卡死全部卡死ScheduledExecutorService 是线程池任务之间隔离任务抛出异常不会杀死整个调度器更精确、更稳定底层是什么内部用的是DelayedWorkQueue延迟阻塞队列按执行时间排序线程不断拿 “到时间” 的任务执行。面试一句话总结ScheduledExecutorService 是 JUC 提供的基于线程池的定时任务组件用来替代 Timer支持延迟执行、固定频率、固定间隔三种定时策略任务隔离、异常安全底层基于延迟队列实现。