大可制作:QQ群:31564239(asp|jsp|php|mysql)

Java Gossip: Fixed-delay Execution 与 Fixed-rate Execution

对于Timer,要将排定时间与任务真正执行时间分别看待。

Timer的schedule()方法在排程时,是采用Fixed- delay execution的方式。也就是如果这次run()方法在周期时间内执行完毕,则下次run()就如期排程。如果这次run()方法无法在周期时间内完 成,则接下来的任务排定就会被拖延,等到上次任务完成后立即排定并执行。

如果想取得TimerTask的排定时间,则可以使用scheduledExecutionTime(),例如:
  • DateTask.java
package onlyfun.caterpillar;

import java.util.*;

public class DateTask extends TimerTask {
public void run() {
System.out.println("任务排定时间:" + new Date(scheduledExecutionTime()));
System.out.println("任务执行时间:" + new Date() + "\n");
try {
Thread.sleep(5000);
}
catch(InterruptedException e) {
}
}
}

如果您使用以下的程序片段来进行排程:
        Timer timer = new Timer();
        timer.schedule(new DateTask(), 1000, 3000);

由于在run()方法中,执行会超出所排定的周期,因此每次的下一次工作都被延迟,在上次工作完成后立即执行:

任务排定时间:Fri Jan 19 11:21:32 CST 2007
任务执行时间:Fri Jan 19 11:21:32 CST 2007

任务排定时间:Fri Jan 19 11:21:37 CST 2007
任务执行时间:Fri Jan 19 11:21:37 CST 2007

任务排定时间:Fri Jan 19 11:21:42 CST 2007
任务执行时间:Fri Jan 19 11:21:42 CST 2007

任务排定时间:Fri Jan 19 11:21:47 CST 2007
任务执行时间:Fri Jan 19 11:21:47 CST 2007

任务排定时间:Fri Jan 19 11:21:52 CST 2007
任务执行时间:Fri Jan 19 11:21:52 CST 2007


Timer还有另一个scheduleAtFixedRate()方法,可以让您采用Fix-rate Execution。也就是如果这次run()方法在周期时间内执行完毕,则下次run()就如期排程。如果这次run()方法无法在周期时间内完成,则 接下来的任务排定不会被拖延,但真正的执行要等到上次任务完成后执行。

如果您使用以下的程序片段来进行排程:
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new DateTask(), 1000, 3000);

在run()方法中,执行会超出所排定的周期,但Timer不管,仍旧照周期排程,而真正的执行则等到上次任务完成后执行:
任务排定时间:Fri Jan 19 11:20:06 CST 2007
任务执行时间:Fri Jan 19 11:20:06 CST 2007

任务排定时间:Fri Jan 19 11:20:09 CST 2007
任务执行时间:Fri Jan 19 11:20:11 CST 2007

任务排定时间:Fri Jan 19 11:20:12 CST 2007
任务执行时间:Fri Jan 19 11:20:16 CST 2007

任务排定时间:Fri Jan 19 11:20:15 CST 2007
任务执行时间:Fri Jan 19 11:20:21 CST 2007

任务排定时间:Fri Jan 19 11:20:18 CST 2007
任务执行时间:Fri Jan 19 11:20:26 CST 2007