zoukankan      html  css  js  c++  java
  • 《JAVA多线程编程核心技术》 笔记:第五章:定时器Timer

    一、定时器Timer的使用

    1.1 方法schedule(TimerTask task, Date time)

    是否过期 执行说明 开始执行时间
    time>当前时间(未过期) 在time到达时执行 time(未被延期)
    time<当前时间(已过期) 当前时间立即执行 当前时间(被延期)

    注意:TimeTask以队列的方式一个一个被顺序执行。

    如果前一个任务执行时间过长,则后面的任务开始执行时间会被延期。和计划时间不同。(这可能也是当time<当前时间时,任务会被立即执行的原因)

    1.2 方法schedule(TimerTask task, Date firstTime, long period)

    开始执行时间:同上

    是否过期 执行说明 开始执行时间
    firstTimetime>当前时间(未过期) 在time到达时执行 time(未被延期)
    firstTimetime<当前时间(已过期) 当前时间立即执行 当前时间(被延期)

    下一次执行时间:同上

    是否过期 执行说明 开始执行时间 实际执行间隔
    任务执行时间<时间间隔
    (即:下一次计划执行时间>当前时间)
    【不延时】
    下一次计划执行时间到达时执行 下一次计划执行时间 计划的间隔时间
    任务执行时间>时间间隔
    (即:下一次计划执行时间<当前时间)
    【延时】
    上一次执行完之后立即执行 当前时间 任务的执行时间

    1.3 方法schedule(TimerTask task, long delay)的测试

    方法作用:以执行 方法schedule(TimerTask task, long delay)的当前时间为参考时间,在此基础上延迟指定的毫秒数后执行一次TimerTask任务。

    开始执行时间:当前时间+延迟时间

    只执行一次,所以,无下一次任务执行情况

    1.4 方法schedule(TimerTask task, long delay, long period)的测试

    方法作用:以执行 方法schedule(TimerTask task, long delay, long period)的当前时间为参考时间,在此基础上延迟指定的毫秒数,再以某一间隔时间无限次地后执行某一任务。(只有第一次执行需要延迟delay,以后执行都是以period为周期间隔)

    由于任务执行时间有延迟,所以对于下一次任务执行的开始时间。就不是很确定了。

    下一次执行时间:同schedule(TimerTask task, Date firstTime, long period)的下一次执行时间

    1.5 cancel()方法

    方法 TimerTask类 Timer类
    cancel()方法 将自身从任务队列中清除 将任务队列中的全部任务清空;
    注意:如果Timer类的cancel()方法没有争抢到queue锁,那么TimerTask类中的代码逻辑会继续执行。

    1.6 方法scheduleAtFixedRate(TimerTask task, Date firstTime, long period)的测试

    1.6.1 基本信息和对比

    方法schedule和方法scheduleAtFixedRate:都会按照顺序执行,所以不会线程不安全;

    延时的情况:都是立即执行,没有什么区别。

    不延时的情况。

    方法 下一次任务的执行时间
    schedule 参考上一次任务“开始”时的时
    scheduleAtFixedRate 参考的是上一次任务“结束”时的时间

    对比说明:

    属性 schedule scheduleAtFixedRate
    下一次任务的执行时间【延时】 立即执行 立即执行
    下一次任务的执行时间【不延时】 schedule【Date】参考上一次任务“开始”时的时间
    schedule【Long】参考上一次任务“结束”时的时间
    因为Long表示延迟时间,Date表示开始时间
    schedule【Date】参考上一次任务“开始”时的时间
    schedule【Long】参考上一次任务“结束”时的时间
    因为Long表示延迟时间,Date表示开始时间
    追赶执行性(主要区别)

    1.6.2 追赶执行性:

    这么说吧,任务计算在13:00执行,每2s执行一次,现在时间是13:20。

    如果不具有追赶执行性:就是在13:00-13:20这段时间内,任务没执行就算了。从当前时间开始,任务继续执行。

    如果具有追赶执行性:就是在13:00-13:20这段时间内,没执行的任务需要被补充执行。从当前时间开始,先补充执行对应时间段内应该被执行的次数,然后任务开始继续正常执行。

    END!

  • 相关阅读:
    MySQL的主从复制配置
    MySQL多实例安装配置实现
    cmake编译安装MySQL5.5.32
    MySQL数据库备份与恢复
    MySQL字符集那些事
    MySQL忘记密码怎么办??
    MySQL创建用户以及授权
    svn commit is not under version control 和 git常用指令
    App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file
    2016年猴年大吉
  • 原文地址:https://www.cnblogs.com/buwuliao/p/9538268.html
Copyright © 2011-2022 走看看