资源--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();,这种是提醒虚拟机可以回收线程,但是不保证一定回收,因此是不可靠的交付服务.

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-06-23 23:58  牛李  阅读(298)  评论(0编辑  收藏  举报

导航