Timer的purge



看Android的文档,提到Timer会和一个Thread关联,所有的任务都在这个关联的Thread里执行。只有一个关联的Thread,所以不会存在同一Timer的两个Task同时执行的情况,这很好理解。

方法cancel会取消所有等待执行的Task,并且关联的Thread会被释放,这也很好理解。

可是看到Timer还提供了purge这个方法,注释是“从task queue里移除所有标记为canceled的task”。这里就有点糊涂了,既然cancel已经有这个功能了,为什么还要多此一举提供purge?

原来TimerTask也有cancel方法,对比Timer的cancel方法,TimerTask的cancel杀伤力没那么大,一次只取消一个Task。那么问题来了:如何释放对TimerTask的引用呢?不然会有内存泄漏。

purge方法就是用来释放内存引用的。purge方法会检查timer队列里标记为canceled的task,将对它的引用置为null。如此说来,purge方法的作用很不小呢?

和我一样从C++转到Java、对Timer不熟悉的同学此刻后背是不是起了冷汗?

唔使惊。可能是Timer的设计者也意识到了这个问题,所以Timer的关联Thread在run的时候会去检查是否有作废了的Task,有的话就将引用置为null。但是Timer关联的这个Thread运行是有条件的,如果Timer的计时时间未到,同时没有新的Task进来,关联的Thread就没法运行,就会存在临时内存泄漏的问题。

未满足好奇心的同学可以参考如下资源:
http://developer.android.com/reference/java/util/Timer.html
http://www.slavaoneverything.com/2011/09/bad-timer/
Android源代码文件java\util\Timer.java
Android源代码文件java\util\TimerTask.java

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值