java.util.Timer 使用介绍

基本概念

顾名思义,计时器。

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()中不要有死循环

猜你喜欢

转载自blog.csdn.net/qq_38861828/article/details/108289000