20181105 Timer(慕课网)

定时任务调度

基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务

Java中的定时调度工具

  • Timer

    JDK提供,不许引入
    功能简单,能用Timer尽量用

  • Quartz

    需要引入
    功能复杂,Timer不能解决时使用

Timer的定义

有且仅有一个后台线程多个业务线程进行定时定频率的调度

关键类:java.util.Timerjava.util.TimerTask

Timer的基本使用

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println(new Date());
    }
}, 2000L, 1000L);

重要函数

Timer

schedule    // 定时执行
scheduleAtFixedRate     // 定时执行,某些情况下不同于schedule
cancel  // 终止此计时器,丢弃所有当前已安排的任务
purge   // 从此计时器的任务队列中移除所有已取消的任务

TimerTask

cancel  // 取消当前TimerTask里的任务
scheduledExecutionTime  // 返回此任务最近实际执行的已安排执行的时间

Timer的schedulescheduleAtFixedRate的区别

  1. 首次计划执行的时间早于当前的时间
  • schedule

"fixed-delay":如果第一次执行时间被delay了,随后的执行时间按照上一次实际执行完成的时间点进行计算

  • scheduleAtFixedRate

"fixed-rate": 如果第一次执行时间呗delay了,随后的执行时间按照上一次开始的时间点进行计算,而且为了赶上进度会多次执行任务,因此TimeTask中的执行体需要考虑同步

  1. 任务执行所需时间超出任务的执行周期间隔
  • schedule

下一次执行时间相对于上一次实际执行完成的时间点,因此执行时间会不断延后

  • scheduleAtFixedRate

下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性

Timer的缺陷

  • 管理并发任务的缺陷

Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与逾期不符

  • 当任务抛出异常时的缺陷

如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行

Timer的使用禁区

  • 对时效性要求较高的多任务并发作业
  • 对复杂的任务的调度

参考资料

猜你喜欢

转载自www.cnblogs.com/huangwenjie/p/9911946.html