定时任务ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor
schedule
延后多少秒执行
异步阻塞处理:
schedule的callable可以不用让提交任务的线程即主线程一直等着返回结果
scheduleAtFixedRate
周期性发布任务,每period执行一次任务, 如果任务执行时间大于period,那就会有任务一直堆积
scheduleWithFixedDelay
周期性发布任务,每次都是任务执行完delay时间后,再次执行任务
下面这部分就是任务提交的过程:
- scheduleWithFixedDelay
- delayedExecute
- ensurePrestart
DelayedWorkQueue
存储结构是数组,而逻辑结构用堆结构进行排序。
最小堆就是最小的元素永远在根节点,也就是我们不关心其余的排序(整个数组不需要从小到大排序),只要每次拿到的是最小的就行。
ScheduledFutureTask
run()
执行任务会调用ScheduledFutureTask 即任务的run()方法:
- 获取是否是周期性执行
- 如果不是周期性执行 ->对应schedule() 方法
直接执行run()方法 - 如果是周期性执行
- 通过runAndReset()执行任务
- setNextRunTime()下一次执行时间
这里根据period是大于0还是小于0分别对应scheduleAtFixedRate()方法和scheduleWithFixedDelay方法 - reExecutePeriodic() 再次执行任务
outerTask 是ScheduledFutureTask 的属性,创建任务的时候就把任务赋值给自己的outerTask属性了,所以这里就可以周期性执行
setNextRunTime()
scheduleWithFixedDelay的period是负值,scheduleAsFixedDelay的period是正值,所以执行任务的时候从这里period的正负就知道应该把time设置为什么了分别对应两个函数的逻辑。