-------android培训、java培训、期待与您交流! ----------
Timer 类的签名:public class Timer extends Object
一个线程使用便利类,用于在后台线程中安排将来要执行的任务。任务可以被安排为执行一次,或者在规定的时间间隔内重复执行。
说明:
每一个Timer对象对应与一个用来顺序执行所有任务的单一后台线程。定时器任务应该迅速完成。如果一个定时器任务占用过多的时间来完成,它会贪婪的占用着定时器的任务执行线程。也就是说这会延迟后续任务的执行,导致在那些耗时任务终于执行完毕后才能执行那些迅速完成的任务。
在最后一个到定时器对象的引用消失并且所有耗时任务执行完成后,定时器的任务执行线程会优雅的终止。(参见垃圾自动回收主题)。然而线程何时被回收是一个随意的时间,即回收垃圾的线程会在不定时的时间间隔运行。默认情况下任务执行线程不是作为守护线程运行,所以它会阻止应用程序被终止。如果一个调用者想要立刻终止一个定时器执行线程,调用者应该调用定时器的Cancel方法。
如果一个定时器的任务执行线程意外终止,比如调用了它的Stop方法后,任何之后在这个定时器对象上调度新任务会导致IllegalStateException异常,就好像定时器的Cancel方法已经被调用了。
Timer类是线程安全的:多线程可以共享同一个Timer对象而不用考虑额外的同步。
本类不提供实时保证:它使用Object的wait(long)方法调度任务。
代替类:
Java5.0推出了java.util.concurrent 包,里面的一个并发工具集ScheduledThreadPoolExecutor是按照一个给定比率或延迟重复执行任务的线程池。它是一个对Timer/TimerTask组合的高效的更灵活的代替,因为它允许多重服务线程,接受各种时间单位,不需要继承TimerTask(只要实现Runnable接口)。配置ScheduledThreadPoolExecutor只有一个线程就等同于Timer。
重要提示:这个类在大量的并发任务调度下测试(数千个任务测试没有出现问题)。在内部它使用一个二进制堆来代表它的任务队列,所以调度一个任务的开销是O(log n),n是并发调度的任务的数量。
重要提示:所有的构造器都创建一个定时器线程。
示例程序:
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* 编程实现每隔两秒执行一次爆炸任务,然后隔四秒执行,在两秒,在四秒。如此循环。
* @author xij
*
*/
public class TraditionalTimerTest
{
private static int count = 0;
public static void main(String[] args)
{
class MyTimerTask extends TimerTask
{
@Override
public void run()
{
count = (count + 1) % 2;
System.out.println("bombing!");
new Timer().schedule(new MyTimerTask(), 2000 + 2000 * count);
}
}
new Timer().schedule(new MyTimerTask(), 2000);
while (true)
{
System.out.println(new Date().getSeconds());
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}