Timer源码分析

Timer源码分析

思路

1.单线程,每个Timer维护一个任务执行线程,所有的定时任务在这个线程中执行

2.任务优先队列,任务按照执行时间排序,执行时间早的排在前面,采用小顶堆的方式实现

3.任务线程每次取任务执行,如果还没到时间,使用 wait() 阻塞任务线程

4.对于 period 重复执行的任务,在取出来执行时,重新计算下次执行时间塞回任务队列

源码片段

Timer

1.关于TaskQueue,只需要知道它是优先队列,时间早的排前面,可以用PriorityQueue代替

2.所有任务调度的最终入口方法

    1.把TimerTask添加到TaskQueue,等待任务线程调度任务

    2.当发现当前任务是在队头,执行 queue.notify,是为了唤醒任务执行线程,这个下面会说


TimerThread

1.线程主体执行mainLoop,当被取消则跳出mainLoop,清空任务队列

2.mainLoop

1.初始,任务队列为空,wait(),等待唤醒

2.取出任务,如果任务未开始,wait()直到调度时间,然后执行任务

注意:若 task.run() 抛出异常,任务线程将会终止,从而后续任务的调度都会被终止


总结

Timer使用 单线程 + wait/notify 的方式实现在指定时间调度任务,当没有任务执行或者任务没到执行时间,TimerThread处于阻塞状态

猜你喜欢

转载自blog.csdn.net/qq_21508059/article/details/79771145
今日推荐