Timer的schedule和scheduleAtFixedRate方法的区别解析

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

(1)schedule方法:“fixed-delay”;如果第一次执行时间被delay了,随后的执行时间
上一次
实际执行完成的时间点
进行计算

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

[c-sharp] view plaincopyprint?

  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秒钟

[java] view plaincopyprint?

  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. public static void main(String[] args) throws ParseException {
  9. SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  10. Date startDate = dateFormatter.parse("2010/11/28 01:06:00");
  11. Timer timer = new Timer();
  12. timer.schedule(new TimerTask(){
  13. public void run() {
  14. try {
  15. Thread.sleep(6000);
  16. catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. System.out.println("execute task!"+ this.scheduledExecutionTime());
  20. }
  21. },startDate, 5 * 1000);
  22. }
  23. }

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秒,而当前任务已经开始执行了,因此两个任务间存在重叠,需要考虑线程同步

时间: 2024-08-11 07:37:23

Timer的schedule和scheduleAtFixedRate方法的区别解析的相关文章

Timer的schedule和scheduleAtFixedRate方法的区别解析(转)

在java中,Timer类主要用于定时性.周期性任务 的触发,这个类中有两个方法比较难理解,那就是schedule和scheduleAtFixedRate方法,在这里就用实例分析一下 (1)schedule方法:“fixed-delay”:如果第一次执行时间被delay了,随后的执行时间按 照 上一次 实际执行完成的时间点 进行计算(2)scheduleAtFixedRate方法:“fixed-rate”:如果第一次执行时间被delay了,随后的执行时间按照 上一次开始的 时间点 进行计算,并且

简单理解java中timer的schedule和scheduleAtFixedRate方法的区别

timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有来得及完成下次任务又交到手上. 我们来举个例子: 暑假到了老师给schedule和scheduleAtFixedRate两个同学布置作业. 老师要求学生暑假每天写2页,30天后完成作业. 这两个学生每天按时完成作业,直到第10天,出了意外,两个学生出去旅游花了5天时间,这5天时间里两个人都没有做作业.任务被拖延了. 这时候两个学生采取的策略就不同了: sch

android timer的schedule和scheduleAtFixedRate运用

在java中,Timer类主要用于定时性.周期性任务的触发,这个类中有两个方法比较难理解,那就是schedule和scheduleAtFixedRate方法,在这里就用实例分析一下 java代码如下: [java] view plaincopy SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date startDate = dateFormatter.parse("2

Java中timer的schedule()和schedualAtFixedRate()函数的区别

本文主要讨论java.util.Timer的schedule(timerTask,delay,period)和scheduleAtFixedRate(timerTask,delay,period)的区别. 这两个函数不管是哪一个,TImer都是单线程的,任务始终在这个单线程里面执行. 下面讨论四种情况: [(任务3s,间隔2s)+(任务2s,间隔3s)]×[schedule+scheduleAtFixedRate] schedule,任务3s,间隔2s new Timer().schedule(

schedule和scheduleAtFixedRate区别

需求: 由于系统长期运作,各设备之间产生很多信息,一段时间后需要清除数据 考虑方案: 用schedule还是scheduleAtFixedRate,在此比较分析了下这两个的区别 schedule和scheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上. schedule和scheduleAtFixedRate 区别: (1) 2个参数的sched

定时任务调度工作(学习记录 四)schedule与scheduleAtFixedRate的区别

根据两种情况来看区别 一.首次计划执行的时间早于当前的时间 1.schedule方法 “fixed-delay”:如果第一次执行时间被延迟了,随后的执行时间按照上一次实际执行完成的时间点进行计算 演示: public class DifferenceTest { public static void main(String[] args) { //规定时间格式 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"

schedule() 和 scheduleAtFixedRate() 的区别--转载

1.  schedule() ,2个参数方法:在执行任务时,如果指定的计划执行时间scheduledExecutionTime <= systemCurrentTime,则task会被立即执行. 2.  schedule() ,3个参数方法:在执行任务时,如果指定的计划执行时间scheduledExecutionTime <= systemCurrentTime,则task会被立即执行,之后按period参数固定重复执行. 3.  scheduleAtFixedRate() ,3个参数方法:在

schedule() 和 scheduleAtFixedRate() 区别

1.  schedule() ,2个参数方法:在执行任务时,如果指定的计划执行时间scheduledExecutionTime <= systemCurrentTime,则task会被立即执行. 2.  schedule() ,3个参数方法:在执行任务时,如果指定的计划执行时间scheduledExecutionTime <= systemCurrentTime,则task会被立即执行,之后按period参数固定重复执行. 3.  scheduleAtFixedRate() ,3个参数方法:在

JAVA随笔篇一(Timer源代码分析和scheduleAtFixedRate的使用)

写完了基础篇,想了非常久要不要去写进阶篇.去写JSP等等的用法.最后决定先不去写.由于自己并非JAVA方面的大牛.眼下也在边做边学,所以决定先将自己不懂的拿出来学并记下来. Timer是Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务.这样的方式能够让程序依照某一个频度运行. 1.Timer类的源代码分析: public class Timer { /** * The timer task queue. This data structure