Timer设计原理

    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图如下:

213023_mmJl_661133.png

代码执行基本流程如下:

实例化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方法。


转载于:https://my.oschina.net/tingzi/blog/223635

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值