1.概览
Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。
最简单常用的用法实例:
private Timer mTimer = new Timer();
private TimerTask mTimerTask;
private int SECOND = 1;
@Override
public void onCreate() {
super.onCreate( );
mTimerTask = new TimerTask( ) {
@Override
public void run() {
sync(); //要做的事情的一个方法
}
};
mTimer.schedule( mTimerTask, 1000, SECOND * 1000 );
}
@Override
public void onDestroy() {
super.onDestroy( );
mTimer.cancel();
}
2.Timer类的方法
schedule(TimerTask task, long delay, long period)
schedule(TimerTask task, Date time, long period)
scheduleAtFixedRate(TimerTask task, long delay, long period)
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
第一个参数是一个TimerTask,第二个参数是延长执行时间或者开始执行日期,第三个参数是执行时间间隔。
3.步分析schedule和scheduleAtFixedRate
(1)2个参数的schedule在制定任务计划时, 如果指定的计划执行时间 scheduledExecutionTime<=systemCurrentTime,则task会被立即执行。 scheduledExecutionTime不会因为某一个task的过度执行而改变。
(2)3 个参数的schedule在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间随着前一次的实际执行时间而变,也就是 scheduledExecutionTime(第n+1次)=realExecutionTime(第n次)+periodTime。也就是说如果第n 次执行task时,由于某种原因这次执行时间过长,执行完后的 systemCurrentTime>=scheduledExecutionTime(第n+1次),则此时不做时隔等待,立即执行第n+1次 task,而接下来的第n+2次task的scheduledExecutionTime(第n+2次)就随着变成了 realExecutionTime(第n+1次)+periodTime。说白了,这个方法更注重保持间隔时间的稳定。
(3)3个参数的scheduleAtFixedRate 在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间在最初就被定下来了,也就是 scheduledExecutionTime(第n次)=firstExecuteTime+n*periodTime;如果第n次执行task时,由 于某种原因这次执行时间过长,执行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),则 此时不做period间隔等待,立即执行第n+1次task,而接下来的第n+2次的task的scheduledExecutionTime(第n+2 次)依然还是firstExecuteTime+(n+2)*periodTime这在第一次执行task就定下来了。说白了,这个方法更注重保持执行频率的稳定。
4.一些注意的问题
- 每一个Timer仅对应唯一一个线程。
- Timer不保证任务执行的十分精确。
- Timer类的线程安全的。