深入理解高并发编程 - 深度解析ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor 继承自 ThreadPoolExecutor 并实现了 ScheduledExecutorService 接口,这使得它可以同时充当线程池和定时任务调度器。
构造方法
public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue());
}
构造方法接收一个 corePoolSize 参数,它表示线程池中的核心线程数。核心线程是一直保持存活的线程,即使没有任务执行,以便支持定时任务的调度。
构造方法的参数及其含义如下:
corePoolSize:线程池中的核心线程数。这些核心线程会一直保持存活,即使没有任务需要执行。核心线程数决定了线程池的基本能力,可以处理的并发任务数为核心线程数。Integer.MAX_VALUE:线程池的最大线程数。这里设置为整数的最大值,表示线程池没有最大线程数限制。当任务数量超过核心线程数时,新的任务会被排队到队列中等待执行。0:非核心线程的闲置存活时间。对于非核心线程(超过核心线程数的线程),如果没有任务需要执行,它们在闲置一段时间后会被回收。NANOSECONDS:时间单位,表示使用纳秒作为时间单位。new DelayedWorkQueue():构造一个 DelayedWorkQueue 对象作为任务队列。DelayedWorkQueue 是一个延迟队列,用于存储定时任务,根据任务的调度时间进行排序。
在这个构造方法中,ScheduledThreadPoolExecutor 将核心线程数、最大线程数、任务队列等参数传递给其父类 ThreadPoolExecutor 的构造方法,从而创建一个具有定时任务调度能力的线程池。
schedule 方法
ScheduledThreadPoolExecutor 提供了一系列 schedule 方法,用于调度定时任务的执行。这些方法允许指定任务的延迟时间,任务会在延迟时间过后执行一次。以下是 schedule 方法的签名和解析:
schedule(Runnable command, long delay, TimeUnit unit):
这个方法用于调度一个 Runnable 任务,在指定的延迟时间后执行一次。返回一个 ScheduledFuture 对象,可以使用它来取消任务或者获取任务执行的结果。
command:要执行的任务。
delay:延迟时间。
unit:时间单位。
示例:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = () -> System.out.println("Task executed after delay");
ScheduledFuture<?> future = scheduler.schedule(task, 5, TimeUnit.SECONDS);
<V> schedule(Callable<V> callable, long delay, TimeUnit unit):
这个方法与上一个方法类似,不同之处在于它可以调度一个带有返回值的 Callable 任务。
示例:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Callable<String> task = () -> "Task result";
ScheduledFuture<String> future = scheduler.schedule(task, 3, TimeUnit.SECONDS);
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit):
这个方法用于调度一个 Runnable 任务,在初始延迟时间后开始执行,然后每隔一定的时间间隔执行一次。任务的执行时间不考虑,每次任务会尽量在指定的时间间隔后执行。
command:要执行的任务。
initialDelay:初始延迟时间。
period:时间间隔。
unit:时间单位。
示例:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = () -> System.out.println("Task executed at fixed rate");
ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit):
这个方法与上一个方法类似,不同之处在于任务的执行间隔是基于任务完成的时间,而不是固定的时间间隔。任务完成后,会等待一段时间(delay)再执行下一次。
command:要执行的任务。
initialDelay:初始延迟时间。
delay:间隔时间。
unit:时间单位。
示例:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = () -> System.out.println("Task executed with fixed delay");
ScheduledFuture<?> future = scheduler.scheduleWithFixedDelay(task, 2, 3, TimeUnit.SECONDS);
这些 schedule 方法可以方便地调度不同类型的定时任务,从简单的延迟执行到周期性执行,以满足各种需求。
decorateTask 方法
在 ScheduledThreadPoolExecutor 中,decorateTask 方法用于对任务进行修饰,以支持定时任务的调度。它会将普通的 Runnable 或 Callable 任务包装成 ScheduledFutureTask 对象,这样可以将任务调度相关的信息添加到任务中,如延迟时间、调度时间等。以下是 decorateTask 方法的部分实现:
protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task) {return task;
}protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task) {return task;
}
这两个方法分别用于对 Runnable 和 Callable 任务进行修饰。它们的作用是将传入的任务(runnable 或 callable)与现有的 RunnableScheduledFuture 任务对象进行合并,从而创建一个新的 RunnableScheduledFuture 对象。
decorateTask 方法默认的实现是将传入的任务不做任何修饰,直接返回原来的任务对象。这是因为大部分情况下,任务并不需要额外的修饰。但是,也可以在自定义的子类中覆盖这个方法,以实现自己的修饰逻辑。
这个方法的存在使得 ScheduledThreadPoolExecutor 可以在任务执行前对任务对象进行一些预处理操作,以满足不同的调度需求。通常情况下,不需要直接调用这个方法,它会在 schedule 方法内部自动调用。
scheduleAtFixedRate 方法
scheduleAtFixedRate 方法用于调度一个任务,在初始延迟时间后开始执行,然后每隔一定的时间间隔执行一次。任务的执行时间不考虑,每次任务会尽量在指定的时间间隔后执行。以下是 scheduleAtFixedRate 方法的签名和解析:
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
参数说明:
command:要执行的任务,即一个实现了 Runnable 接口的对象。
initialDelay:初始延迟时间,表示从调度开始到第一次执行的时间间隔。
period:任务执行的周期间隔。
unit:时间单位。
返回值:ScheduledFuture 对象,表示任务的调度结果。
示例:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);Runnable task = () -> System.out.println("Task executed at fixed rate");// 初始延迟 1 秒,周期间隔 2 秒
ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS);
在上述示例中,任务 task 首次会在 1 秒后执行,然后每隔 2 秒执行一次。需要注意的是,scheduleAtFixedRate 方法不会考虑任务的执行时间。如果任务的执行时间超过指定的周期间隔,后续任务会尽量在每个周期的开始时执行,但可能会累积延迟。因此,如果任务的执行时间很长,可能会影响后续任务的调度,导致调度的间隔变得不精确。
总之,scheduleAtFixedRate 方法适用于需要以固定的时间间隔调度任务,而不考虑任务的执行时间。
scheduleWithFixedDelay 方法
scheduleWithFixedDelay 方法用于调度一个任务,在初始延迟时间后开始执行,然后每次任务完成后会等待一段时间,再执行下一次。任务的执行间隔是基于任务完成的时间,而不是固定的时间间隔。以下是 scheduleWithFixedDelay 方法的签名和解析:
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit);
参数说明:
command:要执行的任务,即一个实现了 Runnable 接口的对象。
initialDelay:初始延迟时间,表示从调度开始到第一次执行的时间间隔。
delay:每次任务执行后的等待时间,即任务完成后等待多长时间再执行下一次。
unit:时间单位。
返回值:ScheduledFuture 对象,表示任务的调度结果。
示例:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);Runnable task = () -> System.out.println("Task executed with fixed delay");// 初始延迟 2 秒,每次任务执行后等待 3 秒再执行
ScheduledFuture<?> future = scheduler.scheduleWithFixedDelay(task, 2, 3, TimeUnit.SECONDS);
在上述示例中,任务 task 首次会在 2 秒后执行,然后每次任务完成后会等待 3 秒,再执行下一次。这个方法适用于需要在任务执行完毕后等待一段时间再进行下一次调度的情况,可以避免任务的执行时间对后续任务的调度造成影响。
需要注意的是,scheduleWithFixedDelay 方法会考虑任务的执行时间,确保每次任务的执行间隔都是基于上一次任务完成的时间。这样可以保证在任何情况下,任务之间的时间间隔都保持相对稳定。
triggerTime 方法
onShutdown 方法用于在线程池关闭时执行特定的清理操作。以下是 onShutdown 方法的签名和解析:
protected void onShutdown() {// 默认的实现为空
}
这个方法是一个钩子方法(hook method),在线程池执行 shutdown 或 shutdownNow 方法时会被调用。默认情况下,onShutdown 方法没有实际的实现,即空方法。但是可以通过继承 ScheduledThreadPoolExecutor 并覆盖 onShutdown 方法,来自定义在线程池关闭时的操作。
在自定义实现中,可以进行一些资源释放、清理工作,或者记录日志等操作,以确保线程池的正常关闭和资源的释放。例如:
class CustomScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor {
public CustomScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize);
}@Override
protected void onShutdown() {// 在线程池关闭时执行特定的清理操作System.out.println("CustomThreadPoolExecutor is shutting down...");// 执行其他清理操作...super.onShutdown();
}
}
通过覆盖 onShutdown 方法,可以在线程池关闭时执行自定义的清理逻辑,从而确保应用程序的资源管理和退出行为。
相关文章:
深入理解高并发编程 - 深度解析ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor 继承自 ThreadPoolExecutor 并实现了 ScheduledExecutorService 接口,这使得它可以同时充当线程池和定时任务调度器。 构造方法 public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, …...
Android---- 一个完整的小项目(消防app)
前言: 针对不同群体的需求,想着应该拓展写方向。医疗app很受大家喜欢,就打算顺手写个消防app,里面基础框架还是挺简洁 规整的。登陆注册和本地数据库写的便于大家理解。是广大学子的毕设首选啊! 此app主要为了传递 消防…...
XXX程序 详细说明
用于记录理解PC程序的程序逻辑 1、程序的作用 根据原作者的说明(文件说明.txt),该程序 (PC.py) 的主要作用是提取某一个文件夹中的某个设备 (通过config中的信息看出来是Ag_T_8) 产生的日志文件,然后提取其中某些需要的数据&…...
perl下载与安装教程【工具使用】
Perl是一个高阶程式语言,由 Larry Wall和其他许多人所写,融合了许多语言的特性。它主要是由无所不在的 C语言,其次由 sed、awk,UNIX shell 和至少十数种其他的工具和语言所演化而来。Perl对 process、档案,和文字有很强…...
Chrome谷歌浏览器修改输入框自动填充样式
Chrome谷歌浏览器修改输入框自动填充样式 背景字体 背景 input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #fff inset !important; }字体 input:-internal-autofill-selected {-webkit-text-fill-color: #000 !important; }...
Azure CLI 进行磁盘加密
什么是磁盘加密 磁盘加密是指在Azure中对虚拟机的磁盘进行加密保护的一种机制。它使用Azure Key Vault来保护磁盘上的数据,以防止未经授权的访问和数据泄露。使用磁盘加密,可以保护磁盘上的数据以满足安全和合规性要求。 参考文档:https://l…...
Java“牵手”根据关键词搜索(分类搜索)速卖通商品列表页面数据获取方法,速卖通API实现批量商品数据抓取示例
速卖通商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取速卖通商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问速卖通商城的网页来获取商品详情信息。以下是两种常用方法的介…...
商城-学习整理-高级-消息队列(十七)
目录 一、RabbitMQ简介(消息中间件)1、RabbitMQ简介:2、核心概念1、Message2、Publisher3、Exchange4、Queue5、Binding6、Connection7、Channel8、Consumer9、Virtual Host10、Broker 二、一些概念1、异步处理2、应用解耦3、流量控制5、概述 三、Docker安装RabbitM…...
Android Camere开发入门(1):初识Camera
Android Camere开发入门(1):初识Camera 初步了解 在Android开发中,相机(Camera)是一个常见而重要的功能模块。它允许我们通过设备的摄像头捕捉照片和录制视频,为我们的应用程序增加图像处理和视觉交互的能力。 随着Android系统的不断发展和更新,相机功能也不断改进和增…...
hive表的全关联full join用法
背景:实际开发中需要用到全关联的用法,之前没遇到过,现在记录一下。需求是找到两张表的并集。 全关联的解释如下; 下面建两张表进行测试 test_a表的数据如下 test_b表的数据如下; 写第一个full join 的SQL进行查询…...
PMP串讲
!5种冲突解决策略 !敏捷3355。 ?PMP项目管理132种工具技术合集: 参考2:项目管理的132种工具 - 水之座 ?质量管理,有多少种图: ?风险管理,有多少种图: --参考:PMP相关的十八种…...
最长回文子序列——力扣516
动态规划 int longestPalindromeSubseq(string s){int n=s.length();vector<vector<int>>...
从零实现深度学习框架——Transformer从菜鸟到高手(二)
引言 💡本文为🔗[从零实现深度学习框架]系列文章内部限免文章,更多限免文章见 🔗专栏目录。 本着“凡我不能创造的,我就不能理解”的思想,系列文章会基于纯Python和NumPy从零创建自己的类PyTorch深度学习框…...
docker监控平台FAST OS DOCKER --1
感觉这个是目前好用的中文平台,暂为v1吧 拉取镜像 docker pull wangbinxingkong/fast运行镜像 docker run --name fastos --restart always -p 18091:8081 -p 18092:8082 -e TZ"Asia/Shanghai" -d -v /var/run/docker.sock:/var/run/docker.sock -v /e…...
SpringBoot2.0集成WebSocket
<!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 新建配置类 import org.springframework.boot.autoconfigure.condition.Cond…...
Vue的Ajax请求-axios、前后端分离练习
Vue的Ajax请求 axios简介 Axios,是Web数据交互方式,是一个基于promise [5]的网络请求库,作用于node.js和浏览器中,它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生node.js http模块, 而在…...
Spring源码深度解析三 (MVC)
书接上回 10.MVC 流程&源码剖析 * 问题1:Spring和SpringMVC整合使用时,会创建一个容器还是两个容器(父子容器?) * 问题2:DispatcherServlet初始化过程中做了什么? * 问题3:请求…...
API接口漏洞利用及防御
API是不同软件系统之间进行数据交互和通信的一种方式。API接口漏洞指的是在API的设计、开发或实现过程中存在的安全漏洞,可能导致恶意攻击者利用这些漏洞来获取未授权的访问、篡改数据、拒绝服务等恶意行为。 1.API接口漏洞简介 API(Application Progr…...
解决Spring mvc + JDK17@Resource无法使用的情况
问题描述 我在使用jdk17进行Spring mvc开发时发现 Resource用不了了。 原因 因为JDK版本升级的改动,在Jdk9~17环境下,搭建Springboot项目,会出现原有Resource(javax.annotation.Resource)不存在的问题,导…...
页面禁用鼠标右键,禁用F12打开开发者工具!!!
文章目录 问题分析方法一方法二方法二问题 今天在浏览博主文章时发现无法复制页面上的内容,也无法F12打开开发者工具,更用不了鼠标右键,于是上网找了原因并亲测可用 分析 方法一 将 <body> 改成 <body oncontextmenu=self.event.returnValue=false>方法二 …...
Android中使用JT808协议进行车载终端通信的实现和优化
JT808是一种在中国广泛应用的车载终端通信协议,用于车辆与监控中心之间的数据通信。下面是关于Android平台上使用JT808协议进行通信的一般步骤和注意事项: 协议了解:首先,您需要详细了解JT808协议的规范和定义。该协议包含了通信消…...
导出pdf
该方法导出的pdf大小是A4纸的尺寸,如果大于1页需要根据元素高度进行截断的话,页面元素需要加 class ergodic-dom,方法里面会获取ergodic-dom元素,对元素高度和A4高度做比较,如果大于A4高度,会塞一个空白元素…...
【考研数学】线形代数第三章——向量 | 基本概念、向量组的相关性与线性表示
文章目录 引言一、向量的概念与运算1.1 基本概念1.2 向量运算的性质 二、向量组的相关性与线性表示2.1 理论背景2.2 相关性与线性表示基本概念2.3 向量组相关性与线性表示的性质 引言 向量是线性代数的重点和难点。向量是矩阵,同时矩阵又是由向量构成的,…...
温故知新之:接口和抽象类有什么区别?
本文以下内容基于 JDK 8 版本。 1、接口介绍 接口是 Java 语言中的一个抽象类型,用于定义对象的公共行为。它的创建关键字是 interface,在接口的实现中可以定义方法和常量,其普通方法是不能有具体的代码实现的,而在 JDK 8 之后&…...
回归预测 | MATLAB实现SSA-RF麻雀搜索优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现SSA-RF麻雀搜索优化算法优化随机森林算法多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现SSA-RF麻雀搜索优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)…...
文旅景区vr体验馆游乐场vr项目是什么
我们知道现在很多的景区或者游玩的地方,以及学校、科技馆、科普馆、商场或公园或街镇,都会建一些关于游玩以及科普学习的项目。从而增加学习氛围或者带动人流量等等。这样的形式,还是有很好的效果呈现。 普乐蛙VR体验馆案例 下面是普乐蛙做的…...
Vue Element upload组件和Iview upload 组件上传文件
今天要分享的是使用这俩个UI组件库的upload组件分别实现调用组件本身的上传方法实现和后台交互。接下来就是开车的时间,请坐稳扶好~ 一、element upload组件传送门 1、html文件 <el-upload ref"uploadRef" :action"uploadUrl" :data"…...
无涯教程-PHP - File 函数
文件系统功能用于访问和操纵文件系统,PHP为您提供了操纵文件的所有功能。 运行时配置 这些功能的行为受php.ini中的设置影响。 NameDefaultChangeableChangelogallow_url_fopen"1"PHP_INI_ALLPHP_INI_ALL in PHP < 4.3.4. PHP_INI_SYSTEM in PHP &l…...
elasticsearch 常用查询 7.4 版本
Elasticsearch 常用查询 match:全文查询exists:查询存在的字段must_not:查询不存在的字段ids:跟据id查询prefix:前缀查询range: 查询范围term:精准查询terms:多术语查询 本文基于es 7.4版本文档…...
ChatGpt 从入门到精通
相关资源下载地址: 基于ChatGPT的国际中文语法教学辅助应用的探讨.pdf 生成式人工智能技术对教育领域的影响-关于ChatGPT的专访.pdf 电子-从ChatGPT热议看大模型潜力.pdf 从图灵测试到ChatGPT——人机对话的里程碑及启示.pdf 正文 ChatGPT 是一种强大的自然语言处理模型&…...
公司注册代办公司靠谱吗/廊坊百度快照优化排名
操作步骤: 新建/opt/install目录(随便建,脚本中路径一致就行)将installjdk(安装命令脚本),java(环境变量配置脚本),jdk-8u201-linux-x64.tar.gz(安装包也可是其他版本JD…...
河南省建设工程招标投标协会网站/中国站长之家
对于并发,Lucene.Net 遵循以下规则:1. 允许任意多的读操作并发,即任意数量用户可同时对同一索引做检索操作。2. 即便正在进行索引修改操作(索引优化、添加文档、删除文档),依然允许任意多的检索操作并发执行。3. 不允许并发修改操…...
1g网站空间/活动推广软文范例
目录一 关联github远程仓库二 关联gitee远程仓库三 origin四 https和git协议五 切换协议六 更新远程仓库到本地1 git fetch2 git pull七 git fetch和git pull的区别1 git fetch2 git pull八 submodule子模块1 背景2 添加子模块3 子模块的使用4 子模块的更新5 删除子模块九 遇到…...
ps做网站的常用素材/学电商出来一般干什么工作
去年的一加7 Pro在市场上反应良好,因为其加大投入与创新,搭载了2K 90Hz屏幕,让一加7 Pro成为真旗舰。但是直到现在,一加现有机型上依然缺失了一个大多数旗舰标配的功能,无线充电。此前刘作虎曾多次回答过这个问题&…...
wordpress 图片无法上传/网站策划书模板
您必须将每个标签输入组合包装在一个元素中,然后将该元素包装在某个容器中.此容器应具有最小宽度,并显示:inline-block ;.然后你让所有的输入项浮动到右边,你已经完成了.这导致了一个非常简单,干净和语义标记与eqaully清洁和可维护的CSS,没有JavaScript,jQuery或其他…...
济南网站建设 伍际网络/哪里有免费的网站推广服务
可量化的软件项目质量考核指标说明关键字:软件项目质量考核有一个完整的指标体系,从可行易操作的角度出发,评价一个软件项目质量情况,可以从以下几个方面出发,获取比较客观的评价指标。指标内容说明如下。1 小组考核内…...