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

【并发编程】聊聊定时任务ScheduledThreadPool的实现原理和源码解析

ScheduledThreadPoolExecutor 是在线程池的基础上 拓展的定时功能的线程池,主要有四种方式,具体可以看代码,
这里主要描述下

  • scheduleAtFixedRate : 除了第一次执行的时间,后面任务执行的时间 为 time = MAX(任务执行时间,每次等待时间) 取最大值
  • scheduleWithFixedDelay:除了第一次执行的时间,后面任务的时间为 任务执行时间+每次等待时间。
    在这里插入图片描述

使用案例

		// 创建一个定时任务线程池ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);// 延迟1S后执行executor.schedule(() -> {}, 1000, TimeUnit.MILLISECONDS);// 立马执行executor.execute(() -> {System.out.println("execute");});// 第一次延迟1S,之后每3S执行一次,如果任务时间超过3S,那么等任务执行后执行下一次任务executor.scheduleAtFixedRate(() -> {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("at"+new Date());}, 1000, 3000, TimeUnit.MILLISECONDS);// 第一次延迟1S执行。任务执行完成后+3S 执行下一次任务executor.scheduleWithFixedDelay(() -> {try {TimeUnit.SECONDS.sleep(5);System.out.println("with"+new Date());} catch (InterruptedException e) {throw new RuntimeException(e);}},1000, 3000, TimeUnit.MILLISECONDS);

源码解析

其实主要就是把握ScheduledFutureTask 和 线程池的核心流程的类就可以。

ScheduledFutureTask

在这里插入图片描述
在这里插入图片描述

DelayedWorkQueue

本质是一个二叉树形式的堆结构,会将邻近执行时间的任务排在前面。

schedule 方法分析

整体的流程其实就是 封装定时任务,然后触发延迟执行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

delayedExecute

在这里插入图片描述
在这里插入图片描述

ScheduledFutureTask.run方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

流程图

这里来简单描述下整体的流程
1.先将任务封装成一个任务 ScheduledFutureTask, 根据线程池状态判断是否执行或者删除任务
2.将任务添加到延迟队列中
3.根据线程池配置 看是否创建线程执行任务。
4.运行的线程不断从延迟队列中获取任务执行。

其实本质就是利用线程池复用机制 + 延迟队列 实现定时任务。

在这里插入图片描述

总结

ScheduledThreadPoolExecutor和ThreadPoolExecutor的区别:

  • ThreadPoolExecutor每次addwoker就会将自己的Task传进新创建的woker中的线程执行,因此woker会第一时间执行当前Task,只有线程数超过了核心线程才会将任务放进队列里
  • ScheduledThreadPoolExecutor是直接入队列,并且创建woker时传到woker的是null,说明woker中的线程刚启动时并没有任务执行,只能通过getTask去队列里取任务,取任务时会判断是否到了执行时间,因此具有了延时执行的特性,并且task执行完了,会将当前任务重新放进堆里,并设置下次执行的时间。

相关文章:

【并发编程】聊聊定时任务ScheduledThreadPool的实现原理和源码解析

ScheduledThreadPoolExecutor 是在线程池的基础上 拓展的定时功能的线程池,主要有四种方式,具体可以看代码, 这里主要描述下 scheduleAtFixedRate : 除了第一次执行的时间,后面任务执行的时间 为 time MAX(任务执行时…...

【虚拟化】Docker Desktop 架构简介

在阅读前您需要了解 docker 架构:Docker architecture WSL 技术:什么是 WSL 2 1.Hyper-V backend 我们知道,Docker Desktop 最开始的架构的后端是采用的 Hyper-V。 Docker daemon (dockerd) 运行在一个 Linux distro (LinuxKit build) 中&…...

DeepSeek 医疗大模型微调实战讨论版(第一部分)

DeepSeek医疗大模型微调实战指南第一部分 DeepSeek 作为一款具有独特优势的大模型,在医疗领域展现出了巨大的应用潜力。它采用了先进的混合专家架构(MoE),能够根据输入数据的特性选择性激活部分专家,避免了不必要的计算,极大地提高了计算效率和模型精度 。这种架构使得 …...

c++实现最大公因数和最小公倍数

最大公因数和最小公倍数的介绍 读这篇文章,请你先对最大公因数以及最小公倍数进行了解: 最大公因数(英文名:gcd) 定义:最大公因数,也称最大公约数,指两个或多个整数共有约数&…...

知识库Dify和cherry无法解析影印pdf word解决方案

近期收到大量读者反馈:上传pdf/图文PDF到Dify、Cherry Studio等知识库时,普遍存在格式错乱、图片丢失、表格失效三大痛点。 在试用的几款知识库中除了ragflow具备图片解析的能力外,其他的都只能解析文本。 如果想要解析扫描件&#xff0c…...

【记录一下学习】Embedding 与向量数据库

一、向量数据库 向量数据库(Vector Database),也叫矢量数据库,主要用来存储和处理向量数据。 在数学中,向量是有大小和方向的量,可以使用带箭头的线段表示,箭头指向即为向量的方向&#xff0c…...

【第21节】C++设计模式(行为模式)-Chain of Responsibility(责任链)模式

一、问题背景 在 VC/MFC 开发中,消息处理机制是核心部分之一。VC 是基于消息和事件驱动的框架,消息的处理流程通常是通过链式传递的方式进行的。例如,一个 WM_COMMAND 消息的处理流程可能如下: (1)MDI 主窗…...

createrepo centos通过nginx搭建本地源

yum update 先安装一个nginx。 安装Nginx yum install gcc gcc-c pcre pcre-devel openssl openssl-devel libtool zlib zlib-devel -y cd /usr/local/src wget http://nginx.org/download/nginx-1.22.0.tar.gz tar -zxvf nginx-1.22.0.tar.gz cd nginx-1.22.0 ./configu…...

在 Docker 中搭建GBase 8s主备集群环境

本文介绍了如何在同一台机器上使用 Docker 容器搭建GBase 8s主备集群环境。 拉取镜像 拉取GBase 8s的最新镜像 docker pull liaosnet/gbase8s或者docker pull liaosnet/gbase8s:v8.8_3513x25_csdk_x64注:在tag为v8.8_3513x25_csdk_x64及之后的版本中,…...

【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型

一、数据类型分类 二、数值类型 1.bit类型 测试环境ubuntu 基本语法: bit[(M)]:位字段类型,M表示每个值的位数,范围从1~64;如果M被忽略,默认为1举例: create table testBit(id i…...

小谈java内存马

基础知识 (代码功底不好,就找ai优化了一下) Java内存马是一种利用Java虚拟机(JVM)动态特性(如类加载机制、反射技术等)在内存中注入恶意代码的攻击手段。它不需要在磁盘上写入文件&#xff0c…...

简单的二元语言模型bigram实现

内容总结归纳自视频:【珍藏】从头开始用代码构建GPT - 大神Andrej Karpathy 的“神经网络从Zero到Hero 系列”之七_哔哩哔哩_bilibili 项目:https://github.com/karpathy/ng-video-lecture Bigram模型是基于当前Token预测下一个Token的模型。例如&#x…...

【清华大学】实用DeepSeek赋能家庭教育 56页PDF文档完整版

清华大学-56页:实用DeepSeek赋能家庭教育.pdf https://pan.baidu.com/s/1BUweVDeG2M8-t0QaIs3LHQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/8a9473493bb0 《实用DeepSeek赋能家庭教育》基于清华大学研究成果,系统阐述了DeepSeek人工智能技…...

黑洞如何阻止光子逃逸

虽然涉及广义相对论,但广义相对论说的是大质量物体对周围空间的影响,而不是说周围空间和空间中的光子之间的关系。也就是说,若讨论光子逃逸问题,则不必限定于大质量的前提,也就是说,若质量周围被扭曲的空间…...

1.4 单元测试与热部署

本次实战实现Spring Boot的单元测试与热部署功能。单元测试方面,通过JUnit和Mockito等工具,结合SpringBootTest注解,可以模拟真实环境对应用组件进行独立测试,验证逻辑正确性,提升代码质量。具体演示了HelloWorld01和H…...

window系统中的start命令详解

start 是 Windows 系统中用于启动新进程或打开新窗口来运行指定程序或命令的命令。以下是对 start 命令参数的详细解释: 基本语法 start ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENO…...

AI编程工具节选

1、文心快码 百度基于文心大模型推出的一款智能编码助手, 官网地址:文心快码(Baidu Comate)更懂你的智能代码助手 2、通义灵码 阿里云出品的一款基于通义大模型的智能编码辅助工具, 官网地址:通义灵码_你的智能编码助手-阿里云 …...

正则表达式,idea,插件anyrule

​​​​package lx;import java.util.regex.Pattern;public class lxx {public static void main(String[] args) {//正则表达式//写一个电话号码的正则表达式String regex "1[3-9]\\d{9}";//第一个数字是1,第二个数字是3-9,后面跟着9个数字…...

原生iOS集成react-native (react-native 0.65+)

由于官方文档比较老,很多配置都不能用,集成的时候遇到很多坑,简单的整理一下 时间节点:2021年9月1日 本文主要提供一些配置信息以及错误信息解决方案,具体步骤可以参照官方文档 原版文档:https://reactnative.dev/docs…...

java错题总结

本篇文章用来记录学习javaSE以来的错题 解答:重载要求俩个方法的名字相同,但参数的类型或者个数不同,但是不要求返回类型相同,所以A正确。 重写还需要要求返回类型相同(呈现父子类关系也可以,但是属于特例&…...

遥感智能体模块全景解析:从任务拆解到工作流编排

1. 遥感智能体的核心架构设计 第一次接触遥感智能体(RS-Agent)这个概念时,很多人会感到困惑:它和传统遥感处理软件有什么区别?简单来说,RS-Agent更像是一个"会思考的助手"。我参与过几个遥感智能…...

深入解析Cache工作原理与多核一致性机制

深入理解Cache工作原理与技术实现1. 计算机体系中的Cache基础1.1 Cache存在的必要性现代计算机系统中,处理器性能与存储器访问性能之间存在显著差距。从历史发展数据来看,CPU计算性能每18个月翻一番(遵循摩尔定律),而D…...

避坑指南:Double DQN和Dueling DQN在TensorFlow 2.x中的5个常见实现错误

Double DQN与Dueling DQN在TensorFlow 2.x中的五大工程陷阱与解决方案 当你在深夜调试强化学习模型时,是否遇到过这种情况:训练曲线像过山车一样剧烈波动,明明采用了Double DQN或Dueling DQN这些改进算法,效果却比基础DQN还要差&a…...

28:L构建AI Agent安全:蓝队的智能代理防御

作者: HOS(安全风信子) 日期: 2026-03-19 主要来源平台: GitHub 摘要: AI Agent的发展为安全防御带来了新的可能性,但也带来了新的安全挑战。基拉等对手可能利用AI Agent进行攻击。L深入研究AI Agent安全技术&#xff…...

AI辅助下的走马观碑:让智能体自动优化你的任务管理应用逻辑

今天想和大家分享一个特别实用的开发经验——如何用AI给任务管理应用"开外挂"。最近在做一个待办事项应用时,我发现单纯的手动输入任务实在太原始了,于是尝试用AI来增强功能,效果出乎意料的好。 智能任务分析功能 传统的任务管理…...

Lattice FPGA开发实战:Diamond与ModelSim协同仿真环境搭建全攻略

1. 环境准备:软件安装与基础配置 第一次接触Lattice FPGA开发时,最头疼的就是仿真环境的搭建。我清楚地记得去年接手MachXO2项目时,光是让Diamond和ModelSim这两个"老伙计"协同工作就折腾了整整两天。不过别担心,跟着我…...

告别编译踩坑:详解GMP交叉编译中DESTDIR和.la文件的那些‘坑’与正确用法

告别编译踩坑:详解GMP交叉编译中DESTDIR和.la文件的那些‘坑’与正确用法 交叉编译是嵌入式开发和跨平台构建中的常见需求,但其中隐藏的陷阱往往让开发者头疼不已。特别是像GMP这样的基础数学库,一旦编译或部署环节出现问题,可能导…...

s2-pro快速上手指南:3步完成文本转语音与音色迁移实操手册

s2-pro快速上手指南:3步完成文本转语音与音色迁移实操手册 1. 平台简介 s2-pro是Fish Audio开源的专业级语音合成模型镜像,它能够将文本内容转换为自然流畅的语音,并支持通过参考音频实现音色迁移功能。这意味着你可以上传一段参考音频&…...

Easy-Scraper:Rust 构建的现代化网页数据采集解决方案

Easy-Scraper:Rust 构建的现代化网页数据采集解决方案 【免费下载链接】easy-scraper Easy scraping library 项目地址: https://gitcode.com/gh_mirrors/ea/easy-scraper 在数据驱动决策的时代,网页数据采集已成为企业获取市场情报、研究人员收集…...

2026年03月27日全球AI前沿动态

一句话总结AI领域覆盖通用/垂直大模型、智能体应用、物理机器人、硬件算力、企业战略、产品更新、投融资、行业观点、民生教育、研究资源全维度,国产技术密集突破、智能体全面落地、硬件自研提速、安全风险频发、老年AI教育落地,行业向实用化、国产化、安…...