zoukankan      html  css  js  c++  java
  • Timer的schedule和scheduleAtFixedRate方法的区别解析

    在java中,Timer类主要用于定时性、周期性任务 的触发,这个类中有两个方法比较难理解,那就是schedule和scheduleAtFixedRate方法,在这里就用实例分析一下

    (1)schedule方法:“fixed-delay”;如果第一次执行时间被delay了,随后的执行时间 上一次 实际执行完成的时间点 进行计算
    (2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间按照 上一次开始的 时间点 进行计算,并且为了”catch up”会多次执行任务,TimerTask中的执行体需要考虑同步

    1. SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");  
    2. Date startDate = dateFormatter.parse("2010/11/26 00:20:00");  
    3. Timer timer = new Timer();  
    4. timer.scheduleAtFixedRate(new TimerTask(){  
    5.    public void run()  
    6.    {  
    7.        System.out.println("execute task!" + this.scheduledExecutionTime());  
    8.    }  
    9. },startDate,3*60*1000);  

    以上的代码,表示在2010-11-26 00:20:00秒开始执行,每3分钟执行一次
    假设在2010/11/26 00:27:00执行
    以上会打印出3次
    execute task!   00:20
    execute task!   00:23    catch up
    execute task!   00:26    catch up
    下一次执行时间是00:29,相对于00:26
    当换成schedule方法时,在2010/11/26 00:27:00执行
    会打印出1次
    execute task!   00:20   无catch up
    下一次执行时间为00:30,相对于00:27

    以上考虑的都是在你设定的timer开始时间后,程序才被执行

    当执行任务的时间大于周期间隔时,会发生什么呢?
    (1)schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后
    (2)scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后,存在并发性
    以下例程序来测试上述结论,TimerTask需要执行6秒钟,但是间隔周期为5秒钟
    1. package test;  
    2. import java.text.ParseException;  
    3. import java.text.SimpleDateFormat;  
    4. import java.util.Date;  
    5. import java.util.Timer;  
    6. import java.util.TimerTask;  
    7. public class Test {  
    8.       
    9.     public static void main(String[] args) throws ParseException {  
    10.         SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");  
    11.         Date startDate = dateFormatter.parse("2010/11/28 01:06:00");  
    12.         Timer timer = new Timer();  
    13.         timer.schedule(new TimerTask(){  
    14.            public void run() {  
    15.                try {  
    16.                    Thread.sleep(6000);  
    17.                } catch (InterruptedException e) {  
    18.                    e.printStackTrace();  
    19.                }  
    20.                System.out.println("execute task!"this.scheduledExecutionTime());  
    21.            }  
    22.         },startDate, 5 * 1000);  
    23.     }  
    24.       
    25. }  

    schedule方法的执行结果如下:
    execute task!1290877560001
    execute task!1290877566001
    execute task!1290877572001
    execute task!1290877578001
    execute task!1290877584001
    execute task!1290877590001
    execute task!1290877596001
    execute task!1290877602001
    execute task!1290877608001
    execute task!1290877614001
    execute task!1290877620001
    execute task!1290877626001
    execute task!1290877632001
    execute task!1290877638001
    可以看出,间隔时间都为6秒,因此,下一次的执行时间点=上一次程序执行完成的时间点+间隔时间
    当换成scheduleAtFixedRate方法的执行结果如下:
    execute task!1290877860000
    execute task!1290877865000
    execute task!1290877870000
    execute task!1290877875000
    execute task!1290877880000
    execute task!1290877885000
    execute task!1290877890000
    execute task!1290877895000
    execute task!1290877900000
    execute task!1290877905000
    execute task!1290877910000
    execute task!1290877915000
    execute task!1290877920000
    execute task!1290877925000
    execute task!1290877930000
    可以看出,间隔时间都为5秒,因此,下一次的执行时间点=上一次程序开始执行的时间点+间隔时间 ;并且因为前一个任务要执行6秒,而当前任务已经开始执行了,因此两个任务间存在重叠,需要考虑线程同步
  • 相关阅读:
    JS中字符串的true转化为boolean类型的true
    jquery select change下拉框选项变化判断选中值
    C# 使用 NPOI 库读写 Excel 文件
    通过微信分享链接,后面被加上from=singlemessage&isappinstalled=1导致网页打不开
    C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
    SQL查询语句如何能够让指定的记录排在最后
    搞懂 JavaScript 继承原理
    基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
    SqlServer 使用sys.dm_tran_locks处理死锁问题
  • 原文地址:https://www.cnblogs.com/duanxiaojun/p/7058643.html
Copyright © 2011-2022 走看看