Android线程—Timer类(二)

时间:2021-09-09 04:22:19

本篇讲解如何使新创建的Timer为守护线程。先看一下API中提供的一个方法。

对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。默认情况下,任务执行线程并不作为守护线程 来运行,所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,那么调用者应该调用计时器的 cancel 方法。

这里说的是用Timer的cancel方法,但是还有一个方法就是构造函数的时候,调用的是带boolean参数的构造函数。

Android线程—Timer类(二)

Timer(boolean isDaemon)

下面看一下代码的示例。

Android线程—Timer类(二)

守护线程

可以看到这边任务执行完后进程就停止了。

前面是说了单个TimerTask任务,那么多个TimerTask任务运行起来会是怎么样的呢?

Timer是允许多个TimerTask任务的,下面看一下代码示例。

Android线程—Timer类(二)

单个Timer运行多个任务

这里创建了两个任务对象。Timer去启动两个任务对象,从结果可以看到,Timer是允许多个TimerTask任务的。其实在Timer里面的TimerTask任务是以队列的方式一个一个被顺序执行的,上面的代码可能还看不出来,下面创建两个MyTask类(所运行的时间不一样),下面看下代码及测试结果。

Android线程—Timer类(二)

任务1不做睡眠

任务1里面不做睡眠处理。

Android线程—Timer类(二)

任务2睡眠20s

在任务2中,让线程睡眠20s(模拟任务执行时间20s),下面看下测试类和结果。

Android线程—Timer类(二)

队列运行

从结果可以看到,MyTask1先开始运行,MyTask2需要排队,等待MyTask1运行完后才能继续运行。

所以总结来说,TimerTask是以队列的方式一个一个被顺序执行的,所以执行的时间有可能和预期的时间不一致,因为前面的任务有可能消耗的时间比较长,则后面的任务运行的时间也会被延迟。