Timer类中定义了一个静态类TimerImpl,该TimerImpl是一个线程类,继承自Thread。Timer类中有一个TimerImpl属性,在Timer的构造函数中new了一个TimerImpl对象,并付给Timer的全局属性TimerImpl。在new TimerImpl时,执行了该TimerImpl线程的start方法。
在Timer对象执行schedule方法时,会调用到scheduleImpl方法,在该方法中,该Timer的TimerImpl对象会调用到方法insertTask,将用户自定义的TimerTask插入到TimerTask对象的一个队列中。同时,执行该TimerImpl的notify方法,唤醒该线程wait()的地方。
Timer与TimerImpl的静态UML图如下:
代码执行基本流程如下:
实例化Timer
1、new Timer
2、new TimerImpl
3、TimerImpl start
4、TimerImpl run
5、TimerImpl wait
执行Timer的schedule方法
6、Timer schedule
7、Timer scheduleImpl
8、TimerImpl insertTask
9、TimerImpl notify
容易出现问题的地方:
在Timer对象调用schedule方法之前绝对不能调用它的cancel方法。如果调用了就会出现错误: java.lang.IllegalStateException: Timer was canceled。所以程序中需要在第一个线程执行Timer对象的schedule方法,在第二个线程中执行Timer对象的cancel方法这种情况,就需要设置一个cancelled标志位,在cancelled前设置false,cancel后设为true,并在执行第一个线程的schedule方法前,判断cancelled标志位是否不为true,如果为true则不执行schedule方法。