android timer的schedule和scheduleAtFixedRate运用

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

java代码如下:

[java] view
plain
copy

  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);

分析:

A.以上的代码,表示在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:20而言

B.当换成schedule方法时,在2010/11/26 00:27:00执行会打印出1次.

execute task!   00:20   无catch up

下一次执行时间为00:30,是相对于实际执行时间00:27而言

(1)scheduleAtFixedRate方法:“fixed-rate”;如果第一次执行时间被延迟了,随后的执行时间按照设定的开始执行时间(实例中是:2010/11/26 00:20:00)进行计算,并且为了达到固定的速率,会执行从设定的开始执行时间到实际执行时间之间的周期任务(比如设定是0点执行任务,设定的周期是10分钟,那么当1点钟才开始执行任务时,这时会立即执行六次任务),这时TimerTask中的执行体需要考虑同步。

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

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

当执行任务的时间大于周期间隔时,会发生什么呢?

(1)schedule方法:下一次执行时间是相对于上一次实际执行完成的时间点,因此执行时间会不断延后.

(2)scheduleAtFixedRate方法:下一次执行时间是相对于上一次开始的时间点,因此执行时间不会延后,存在并发性.

以下例程序来测试上述结论,TimerTask需要执行6秒钟,但是间隔周期为5秒钟

[java] view
plain
copy

  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-29 23:08:45

android timer的schedule和scheduleAtFixedRate运用的相关文章

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

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

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

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

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

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

Android Timer 的 schedule()方法定时循环切换图片

void java.util.Timer.schedule(TimerTask task, long delay, long period)第一个参数,是 TimerTask 类,在包:import java.util.TimerTask .使用者要继承该类,并实现public void run() 方法,因为 TimerTask 类 实现了 Runnable 接口.第二个参数的意思是,用户调用 schedule() 方法后,要等待这么长的时间才可以第一次执行run() 方法.第三个参数的意思就

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

Android Timer用法

Android考虑到线程安全问题,不允许在线程中执行UI线程,在Android中,有一个类:android.os.Handler,这个可以实现各处线程间的消息传递.先看段代码,这个实例化了一个Handler,Handler可以通过Message在多个线程通讯,这里做的是定时recLen加1,然后以一定的格式,显示到recTime上(UI线程上的操作).  1 final Handler handler = new Handler(){   2     public void handleMess

schedule和scheduleAtFixedRate区别

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

Android Timer和TimerTask

以下内容根据 The JavaTM Tutorial 和相关API doc翻译整理,以供日后参考: 1.概览 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复多次.TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务.简单的一个例程: mport java.util.Timer; import java.util.TimerTask; /** * Simple demo that uses java.util.Timer to