对于Timer,要将排定时间与任务真正执行时间分别看待。
Timer的schedule()方法在排程时,是采用Fixed-
delay
execution的方式。也就是如果这次run()方法在周期时间内执行完毕,则下次run()就如期排程。如果这次run()方法无法在周期时间内完
成,则接下来的任务排定就会被拖延,等到上次任务完成后立即排定并执行。
如果想取得TimerTask的排定时间,则可以使用scheduledExecutionTime(),例如:
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
|
|