基本概念
顾名思义,计时器。
java.util.Timer(计时器)要和java.util.TimerTask(计时器任务)一起使用。
Timer # 常用方法:
public void schedule(TimerTask task, long delay, long period)
delay毫秒之后,开始循环执行定时器任务task,循环间隔是period毫秒;
一个Timer对象可以多次调用schedule()方法,每次调用schedule都将在任务队列中添加一个task,先调用的,
先执行,执行结束再调用下一个task;对于循环执行的task,走完第一遍它的run方法,就准备执行下一个
task,此时前一个task仍在循环执行。
一个Timer对象持有一个task队列、多个工作线程。
例:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO,异步执行;开启一个工作线程
}
}, 0, 100);
public void cancel()
取消任务队列中的所有等待执行的定时器任务
一个Timer对象可重复cancel
定时器取消后不可复用,即:一个Timer对象,cancel后,不能再调用schedule
从源码上看:此cancel()将所有等待执行的task置为null
public int purge()
清除任务队列中所有被取消的task
从源码上看:purge将所有标记为canceled的task对象置为null
Most programs will have no need to call this method.
It is designed for use by the rare application that cancels a large number of tasks. Calling this method trades time for space.
@return the number of tasks removed from the queue.
demo:以下代码位于Activity中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTimer = new Timer();
mTimer.schedule(mTimerTask1, 0, 100); //立马执行的task,不会被cancel()停止
mTimer.schedule(mTimerTask2, 3000, 100);
//mTimerTask1和mTimerTask2的run()中都有一个死循环
}
@Override
protected void onResume() {
super.onResume();
mTimerTask1.cancel();
mTimerTask2.cancel(); //将task标记为cancled
Log.d(TAG, "onResume: " + mTimer.purge()); //mTimer.purge() = 2
}
------------------------------------------
@Override
protected void onResume() {
super.onResume();
mTimer.cancel(); //将task置为null
Log.d(TAG, "onResume: " + mTimer.purge()); //mTimer.purge() = 0
}
TimerTask # 常用方法:
public boolean cancel()
将当前task从任务队列中取消,其他task不受影响
可以重复cancel
从源码上看:此cancel()将当前task对象标记为canceled
对于一个task,第一次cancel(),return true
第二、三、四、、、次cancel(),return false
源码:
public boolean cancel() {
synchronized(lock) {
boolean result = (state == SCHEDULED);
state = CANCELLED;
return result;
}
}
public long scheduledExecutionTime()
获取当前task预计执行时间
Timer / TimerTask # cancel()注意
- 在delay结束前调用这两种cancel(),可以取消task的执行
- 对应循环调度的task,调用这两种cancel(),可以取消下一次调度task
- 这两种cancel()无法停止正在执行的task,即无法停止正在执行的 TimerTask # run(),除非run()方法自己执行结束了,所以run()中不要有死循环