资源--timer的使用
Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。
可以这样使用timertask
public void start() {
//利用timer计时器创建子线程,从而保证主线程不会卡死,延迟
timer = new Timer();
timerTask = new TimerTask() {
public void run() {
i--;
Message message = handler.obtainMessage();
message.arg1 = i;
handler.sendMessage(message);
}
};
timer.schedule(timerTask, 1000);//执行timer计时器
}
或者这样使用timertask
public class MyTask extends TimerTask
{
private int id;
public MyTask(int id)
{
this.id = id;
}
public void run()
{
System.out.println("线程" + id + ":正在执行");
//System.gc();提醒虚拟机可以回收线程,但是是不可靠的服务
}
}
该程序的handler的代码
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
if(msg.arg1!=-1){//判断倒计时是否已经结束
time.setText(msg.arg1+"");
start();
}else{
timer.cancel();//取消timer线程的后台自动运行
Toast toast = Toast.makeText(getApplicationContext(), "倒计时结束",Toast.LENGTH_SHORT);
toast.show();
}
}
};
Timer终止的问题:
默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。可以通过以下3种方法终止一个timer线程:
(1)调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里;
(2)让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行;
(3)调用System.exit方法,使整个程序(所有线程)终止。
TimerTask也有cancel方法。
上面所说的“只要一个程序的timer线程在运行,那么这个程序就会保持运行”。那么反过来,如果Timer里的所有TimerTask都执行完了,整个程序会退出吗,经测试答案是否定的,例如上面的测试代码,如果只加第一个TimerTask在Timer中执行:
timer.schedule(new MyTask(1), 5000);// 5秒后启动任务
那么5秒以后,其实整个程序还是没有退出,Timer会等待垃圾回收的时候被回收掉然后程序会得以退出,但是多长时间呢?在TimerTask的run函数执行完以后加上System.gc();,这种是提醒虚拟机可以回收线程,但是不保证一定回收,因此是不可靠的交付服务.
版权声明:本文为博主原创文章,未经博主允许不得转载。