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

转载 2013年12月03日 10:42:30

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

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

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

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

写完了基础篇,想了很久要不要去写进阶篇,去写JSP等等的使用方法,最后决定先不去写,因为自己并不是JAVA方面的大牛,目前也在边做边学,所以决定先将自己不懂的拿出来学并记下来。 Timer是Java自...
  • feiyangtianyao
  • feiyangtianyao
  • 2015年08月11日 14:51
  • 2765

Timer和TimeTask类(定时调度)学习之秒表计时器

最近在做一个自己的小项目,用到了定时调度(Timer和TimeTask类),特做此记录 Timer类: Timer类是一种线程设施,可以用来实现在某一个时间或某一段时间后,安排某一个任务执行一次,或定...
  • wei18359100306
  • wei18359100306
  • 2015年01月02日 23:53
  • 2692

Java Timer的使用(timer.schedule定时执行)

1.概览 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。 TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。 ...
  • guoxiaodiu_
  • guoxiaodiu_
  • 2015年07月21日 14:09
  • 3062

Timer 的 schedule()方法 一看就懂

Timer 的 schedule()方法 一看就懂 timer.schedule(new MyTask(),long time1,long timer2); 第一个参数,是 Time...
  • zhuifengshenku
  • zhuifengshenku
  • 2014年01月24日 19:33
  • 1554

Timer的 schedule 和 scheduleAtFixedRate 方法辨析—————修正上篇博文

Timer的schedule和scheduleAtFixedRate方法辨析,有需要的朋友可以参考下。 首先我们来看看在API中是如何描述java.util.Timer类的。(以下摘自Jav...
  • idaretobe
  • idaretobe
  • 2014年09月27日 16:02
  • 381

java中的定时器以及schedule和scheduleAtFixedRate方法的探究

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import ja...
  • Senssic
  • Senssic
  • 2013年08月03日 12:57
  • 680

Java线程池架构2-多线程调度器(ScheduledThreadPoolExecutor)

在前面介绍了java的多线程的基本原理信息:《Java线程池架构原理和源码解析(ThreadPoolExecutor)》,本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,...
  • xieyuooo
  • xieyuooo
  • 2013年04月29日 03:58
  • 9758

Android四大组件之service(二)——用service、scheduleAtFixedRate写一个后台定时执行任务

点击查看原文上篇介绍了service及其生命周期,这里scheduleAtFixedRate介绍java api中可直接查;这里写一个后台定时执行任务的例子,直接上代码:ScheduledThread...
  • Metis100
  • Metis100
  • 2015年03月23日 23:39
  • 1221

如何正确的使用Timer的schedule()方法?

timer.schedule(new MyTask(),long time1,long timer2); 今天算是彻底的搞懂了这个曾经让我为之头疼的方法。下面我就重点介绍一下: 第一个参数...
  • l109907
  • l109907
  • 2014年06月18日 21:16
  • 302

如何正确的使用Timer的schedule()方法?

timer.schedule(new MyTask(),long time1,long timer2); 今天算是彻底的搞懂了这个曾经让我为之头疼的方法。下面我就重点介绍一下: 第一个参数,是 T...
  • okkeqin
  • okkeqin
  • 2014年10月10日 14:40
  • 376
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Timer的schedule和scheduleAtFixedRate方法的区别解析
举报原因:
原因补充:

(最多只允许输入30个字)