当前位置: 首页 > news >正文

【Java】浅谈ScheduledThreadPoolExecutor

一,概述

ScheduledThreadPoolExecutor继承ThreadPoolExecutor,新增了定时、延时任务API,结合

【Java】DelayQueue-CSDN博客

线程池原理简谈_线程池懒加载-CSDN博客

两篇基础文章,本篇笔者简单看下ScheduledThreadPoolExecutor是如何实现定时、延时任务。

二,实现

延时任务

1,实现延迟任务,需要延时为key的优先级队列,看下ScheduledThreadPoolExecutor构造方法,

可以看到,其BlockQueue是DelayedWorkQueue,这是ScheduledThreadPoolExecutor静态内部类,

通过poll从队列中取值,当getDelay返回值 > 0,则不能执行此任务,这是延迟任务的判断依据。

接下来,跟进getDelay,看下RunnableScheduleFeturn唯一实现类

time保留了触发时间,这得从schedule方法说起

当前时间+delay即triggerTime,这很容易

上文说过,DelayQueue是一个优先级队列,那么加入队列,会对time进行插入排序,简单看下offer

找到队列中合适位置,插入,不赘述。

此处的queue是以最小堆结构实现,

最后,当满足延时条件后,执行run即可,

定时任务

scheduleAtFixedRate方法作为分析入口

将innitalDelay和period保存到ScheduledFuturnTask,并且outerTask保存一次sft,就是t本身

跟进Run方法

因为outerTask本身就是当前Task,也是一个延时任务,outerTask属于自己引用自己,

当任务run后,通过setNextRuntime设置下一次的触发时间,再重新入队即可

因此,定时任务本质是延时任务执行完毕后又将自己加入执行队列

http://www.xdnf.cn/news/1002007.html

相关文章:

  • Python实战应用-Python实现Web请求与响应
  • 智能合约的浪潮:从区块链到业务自动化的 IT 新引擎
  • 服务器-客户端下kafka的消息处理流程
  • Vue3+PDF.js 实现高性能 PDF 阅读器开发实战
  • C# 动态管理控件和事件,批量查询管理同类控件
  • JavaWeb期末速成 JSP
  • 浅谈DaemonSet
  • PRIMES“中国校准实验室”正式运营,携手东隆科技共筑精准测量新标准
  • 通过同步压缩小波变换实现信号的分解和重构
  • 概率论几大分布的由来
  • 基于STM32汽车温度空调控制系统
  • Unity-通过Transform类学习迭代器模式
  • 数据集-目标检测系列- 孔雀 数据集 peacock >> DataBall
  • FFmpeg 压缩视频文件
  • 力扣HOT100之技巧:136. 只出现一次的数字
  • C#调用C++ 结构体方法
  • GitHub 上 PAT 和 SSH 的 7 个主要区别:您应该选择哪一个?
  • Transformer 与 XGBoost 协同优化的时间序列建模
  • LSTM助力迁移学习!深度学习架构性能提升,准确率达到99.91%!
  • TCN+Transformer+SE注意力机制多分类模型 + SHAP特征重要性分析,pytorch框架
  • 用于在多个远程计算机上求解的 Ansoft RSM 设置 - Windows
  • 实战案例-FPGA的JESD204B IP核配置详解
  • 【springboot组件开发】三方中间件自定义自动装载(rabbitmq/rocketmq/cmq)
  • 记录一次jenkins slave因为本地安装多个java版本导致的问题
  • stm32f103 标准库移植rt-thread nano
  • 学习笔记整理之状态图与状态图搜索
  • Windows 提权工具(“Potato“ 系列)用法指南
  • 火线、零线、地线 基础知识
  • 实现图片懒加载
  • 大话软工笔记—架构的概要设计