【并发】13、定时任务ScheduledThreadPoolExecutor

本文深入探讨ScheduledThreadPoolExecutor,包括schedule、scheduleAtFixedRate和scheduleWithFixedDelay等方法的用法。讲解DelayedWorkQueue的堆结构和ScheduledFutureTask的执行逻辑。同时,介绍了定时线程池在分布式锁和微服务注册发现中的应用,并对比了Timer和ScheduledThreadPoolExecutor的差异。
摘要由CSDN通过智能技术生成

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设置为什么了分别对应两个函数的逻辑。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值