JDK scheduler
Java JDK实现调度方式有Timer和ScheduledThreadPoolExecutor (不考虑Quartz以及Spring Scheduler等)
Timer
基本类Timer/TimerTask,JDK Timer两个缺点
- 只有一个线程执行所有TimerTask,如果有一个TimerTask比较耗时,其他TimerTask执行时间就不准了
- TimerTask中间抛出异常会终止Timer,其他任务也不能调度了
ScheduledExecutorService / ScheduledThreadPoolExecutor
Executors.newScheduledThreadPool能解决Timer上面两个问题。从实现看,它基于优先级队列实现。
1 | /** |
FixedRate & FixedDealy
- 调度中的FixedRate指的是任务以固定时间频率执行(本次任务开始执行时间和下次任务开始执行时间是固定的)
- 调度中的FixedDelay指的是任务结束后以固定间隔执行下一个任务(本次任务执行完成后和下次任务开始执行间隔是固定的,下次任务执行时间不固定,取决于上次任务结束时间)
- Executors.newScheduledThreadPool FixedRate方式执行时,如果前一个任务执行时间太长,后一个任务顺延,不会并发执行。参考下面源码。
- Timer的scheduleAtFixedRate如果任务执行时间>时间间隔,会并发执行
1 | /** |
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 石头记!