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处于阻塞状态