Timer类的schedule方法的TimerTask任务队列是排队运行的,那么任务队列怎么清除呢?
用的是cancel方法,而TimerTask和Timer都有cancel的方法,下面看下这两种的示例。
TimerTask类的cancel方法
TimerTask类中的cancel方法的作用是将自身从任务队列中清除,既然是TimerTask类的方法,那么就是在TimerTask的子类中调用,下面请看示例。
在任务里一个任务调用cancel方法,另外一个不调用,用来作对比,下面请看测试结果。
从结果中可以看到,MyTask1任务只运行一次就从任务队列里面清除,而其他任务(MyTask2)则不受影响。
Timer类的cancel方法
Timer类的cancel方法的作用是将任务队列中的全部任务清空。下面看下示例代码。
在这边要注意的是,如果timer.cancel()方法放在timer.schedule(mt1, dateByStr, 4000)代码之前的话,运行的话就会报错,因为还没开始就结束了。具体可以看下源代码哪里报的异常。
从这边结果可以看到,调用timer.cancel()方法之后,任务就被清除了,进程也结束了,这边没把运行的进程截下来,大家可以打打代码看下,此时的按钮已经变灰,也就是进程已经结束。
但是这边使用Timer类的cancel方法的时候也要注意,有时候并没有争抢到队列锁的时候,也是会使队列任务正常执行,下面看下简单的实例代码。
可以看到有些timer类还是执行了。所以在调用timer的cancel的时候需要注意。