ScheduledExecutorService详解

文章目录

  • 基础定义
  • 主要特点
  • schedule延迟不循环
  • scheduleAtFixedRate延迟且循环
  • scheduleWithFixedDelay严格延迟且循环
  • 取消特定定时任务

基础定义

ScheduledExecutorService是Java并发包中提供的一个接口,用于执行定时任务。它继承自ExecutorService接口,并提供了额外的方法来安排和控制定时任务的执行。ScheduledExecutorService有线程池的特性,也可以实现任务循环执行,可以看作是一个简单地定时任务组件,因为有线程池特性,所以任务之间可以多线程并发执行,互不影响,当任务来的时候,才会真正创建线程去执行,我们在做一些普通定时循环任务时可以用它,比如定时刷新字典常量,只需要不断重复执行即可。

主要特点

以下是ScheduledExecutorService的一些主要特点和用法:

  • 定时任务调度:ScheduledExecutorService提供了两种方法来安排定时任务的执行:scheduleAtFixedRate和scheduleWithFixedDelay。这两种方法都可以指定任务的初始延迟时间、执行间隔以及任务的具体逻辑。

    • scheduleAtFixedRate方法按照固定的频率执行任务,即每隔指定的时间间隔执行一次。如果上一个任务的执行时间超过了设定的间隔,那么下一个任务会在上一个任务结束后立即开始执行。
    • scheduleWithFixedDelay方法也是按照固定的时间间隔执行任务,但与scheduleAtFixedRate不同的是,它会等待上一个任务完成后再开始下一个任务。
  • 任务取消:通过ScheduledExecutorService安排的任务可以通过Future对象进行取消。调用Future对象的cancel方法可以请求取消执行此任务。传递给cancel方法的参数决定了是否允许正在运行的任务正常完成。如果传递true,即使任务正在运行也会被中断;如果传递false,则允许正在运行的任务正常完成,但阻止还未开始的任务启动。

  • 线程池管理:ScheduledExecutorService是基于线程池实现的,因此它具有线程池的特性。你可以使用Executors类提供的工厂方法创建不同类型的线程池,如固定大小的线程池、缓存线程池等。

  • 资源释放:当不再需要使用ScheduledExecutorService时,应该及时关闭它以释放系统资源。可以使用shutdown或shutdownNow方法来关闭线程池。shutdown方法会等待所有已提交的任务完成后再关闭,而shutdownNow则会尝试立即停止所有正在执行的活动任务。

schedule延迟不循环

   /*** 1. 延迟不循环任务schedule方法,在固定时间点publishTime执行一次.* schedule(Runnable command, long delay, TimeUnit unit)* 参数1:任务* 参数2:方法第一次执行的延迟时间* 参数3:延迟单位* 说明:延迟任务,只执行一次(不会再次执行),参数2为延迟时间** @param publishTime*/public static void testSchedule(LocalDateTime publishTime, UUID noticeId) {long delay = publishTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() - System.currentTimeMillis();ScheduledFuture scheduledFuture = executor.schedule(() -> {// 任务逻辑try {System.out.println(noticeId + ":执行任务...");} catch (Exception e) {System.out.println("定时任务执行出错..");}}, delay, TimeUnit.MILLISECONDS);taskMap.put(noticeId, scheduledFuture);executor.shutdown();}

scheduleAtFixedRate延迟且循环

/*** 2. 延迟且循环cheduleAtFixedRate方法* cheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)* 参数1:任务* 参数2:初始化完成后延迟多长时间执行第一次任务* 参数3:任务时间间隔* 参数4:单位* 方法解释:是以上一个任务开始的时间计时,比如period为5,那5秒后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,* 如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行,如果你的任务执行时间超过5秒,那么任务时间间隔参数将无效,任务会不停地循环执行,* 由此可得出该方法不能严格保证任务按一定时间间隔执行*/public static void testScheduleAtFixedRate() {executor.scheduleAtFixedRate(() -> {try {System.out.println("执行任务开始...");Thread.sleep(3000);System.out.println("执行任务结束...");} catch (Exception e) {System.out.println("定时任务执行出错..");}}, 0, 2, TimeUnit.SECONDS);}

scheduleWithFixedDelay严格延迟且循环

 /*** scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit);* 参数1:任务* 参数2:初始化完成后延迟多长时间执行第一次任务* 参数3:任务执行时间间隔* 参数4:单位* 解释:以上一次任务执行结束时间为准,加上任务时间间隔作为下一次任务开始时间,由此可以得出,任务可以严格按照时间间隔执行*/public static void testScheduleWithFixedDelay() {executor.scheduleAtFixedRate(() -> {try {System.out.println("执行任务开始...");Thread.sleep(3000);System.out.println("执行任务结束...");} catch (Exception e) {System.out.println("定时任务执行出错..");}}, 0, 2, TimeUnit.SECONDS);}

取消特定定时任务

	 /*** 记录定时任务的线程信息.*/private static final ConcurrentHashMap<UUID, ScheduledFuture> taskMap = new ConcurrentHashMap<>();/*** executor.*/private static final ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);public static void main(String[] args) {// 新增UUID uuid = UUID.randomUUID();testSchedule(LocalDateTime.of(2024, 05, 14, 13, 55, 0), uuid);// 更新,可以删除上次的任务ScheduledFuture future = taskMap.get(uuid);if (Objects.nonNull(future)) {future.cancel(true);}testSchedule(LocalDateTime.of(2024, 05, 14, 11, 05, 0), UUID.randomUUID());}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何更换远程服务器的Python版本

目录 前言 正文 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4eb; You can reach me by url below:My Blo…

简单的mysql主从复制搭建

文章目录 准备工作用Docker安装MySQL主库配置【192.168.13.32】从库配置【192.168.13.108】小结 准备工作 用虚拟机提前准备两台服务器&#xff0c;并且在服务器中分别安装好MySQL&#xff0c;服务器的信息如下&#xff1a; 数据库IP主节点192.168.13.32从节点192.168.13.108…

IDEA终端环境配置

Idea如何配置终端&#xff1b; 第一步&#xff1a;找到我的电脑&#xff0c;右击——属性——高级系统设置——环境变量 先配置path: 在后面加入&#xff1a;C:\Program Files (x86)\Java\jdk1.7.0_75\bin&#xff08;每个人放置jdk的位置不同。&#xff09; 新建classpath:…

【MySQL数据库】初步认识数据库,实现基本操作

在信息爆炸的今天&#xff0c;数据无处不在&#xff0c;它们构成了互联网世界的基石。但数据本身若未经有效组织和管理&#xff0c;就如同散落在沙滩上的珍珠&#xff0c;难以发挥其真正的价值。这时&#xff0c;“数据库”这一概念便如同一根线&#xff0c;将这些珍珠串联起来…

【Redis】Redis 主从集群(一)

为了避免 Redis 的单点故障问题&#xff0c;可以搭建一个 Redis 集群&#xff0c;将数据备份到集群中的其它节点上。若一个 Redis 节点宕机&#xff0c;则由集群中的其它节点顶上 1.主从集群搭建 Redis 的主从集群是一个“一主多从”的读写分离集群。集群中的 Master 节点负责…

从油猴脚本管理器的角度审视Chrome扩展

从油猴脚本管理器的角度审视Chrome扩展 在之前一段时间&#xff0c;我需要借助Chrome扩展来完成一个需求&#xff0c;当时还在使用油猴脚本与浏览器扩展之间调研了一波&#xff0c;而此时恰好我又有一些做的还可以的油猴脚本TKScript (点个star吧 &#x1f601;)&#xff0c;相…

面向对象 05:三大特性之——继承,继承在 Java 中的相关使用,区分关键字 super 和 this,方法重写的注意点

一、前言 记录时间 [2024-05-13] 系列文章简摘&#xff1a; 面向对象 01&#xff1a;Java 面向对象相关内容整体概述 面向对象 02&#xff1a;区分面向过程与面向对象&#xff0c;类和对象的关系 面向对象 03&#xff1a;类与对象的创建、初始化和使用&#xff0c;通过 new 关键…

数字人解决方案——AniPortrait音频驱动的真实肖像动画合成

概述 在当今数字化时代&#xff0c;将静态图像和音频素材转化为动态、富有表现力的肖像动画&#xff0c;已经成为游戏、数字媒体、虚拟现实等多个领域的重要技术。然而&#xff0c;开发人员在创建既具有视觉吸引力又能保持时间一致性的高质量动画框架方面面临着巨大挑战。其中…

k8s endpoint

Endpoint Service 并不是和 pod 直接相连的&#xff0c;Endpoint 介于两者之间。Endpoint 资源就是暴露一个服务的 IP 地址和端口的列表。 虽然在 spec 服务中定义了 pod 选择器&#xff0c;但在重定向传入连接时不会直接使用它。选择器用于构建 IP 和端口列表&#xff0c;然…

数据特征降维 | t-分布随机邻域嵌入(t-SNE)附Python代码

t-分布随机邻域嵌入(t-Distributed Stochastic Neighbor Embedding,t-SNE)是一种非线性降维和可视化技术,广泛用于高维数据的可视化和聚类分析。 t-SNE的基本思想是通过在高维空间中测量样本之间的相似性,将其映射到低维空间中,以便更好地展示数据的结构和关系。与传统的…

优思学院:精益六西格玛如何影响企业文化?

精益六西格玛&#xff08;Lean Six Sigma&#xff09;是一种在优化生产过程、提高效率、减少浪费的管理方法论。其影响远不止于生产线或质量控制部门&#xff0c;实际上&#xff0c;精益六西格玛的实施可以深刻影响企业文化的各个层面&#xff0c;從而令企業獲得真正最大的成功…

libxml2解析xml文档,c语言实现,并给出案例

test.xml文档内容如下&#xff1a; <root><name>Debug.group</name><website>https://debug.group</website><function><json>https://debug.group/json.html</json><sql>https://debug.group/sql.html</sql><…

SpringBoot MockMvc

SpringBoot MockMvc 1 什么是 MockMvc&#xff1f;2 为什么使用 MockMvc&#xff1f;3 如何使用 MockMvc&#xff1f;3.1 Controller3.2 测试方法一3.3 测试方法二 1 什么是 MockMvc&#xff1f; Spring Boot 提供了一个方便的测试工具类 MockMvc&#xff0c;用于对 Controlle…

【JavaScript超详细的学习笔记-下】JavaScrip超详细的学习笔记,共27部分,12多万字,学习js不错的选择,内容超详细

想要获取笔记的可以点击下面链接获取&#xff0c;或者私信我 ** JavaScript超详细的学习笔记&#xff0c;点击我获取 13&#xff0c;闭包 13-1 闭包 闭包是指有权访问另一个函数作用域中的变量的函数&#xff1b;其本质就是在一个函数内部创建另一个内部函数&#xff1b;并…

基于若依的开源网盘系统

简介 在线网盘系统&#xff0c;使用了DFA算法&#xff0c;实现了文件夹的创建与修改&#xff0c;多级目录&#xff0c;很正常的文件夹一样&#xff0c;支持所有文件上传&#xff0c;并按文件类型分类&#xff0c;支持文件删除&#xff0c;回收站管理&#xff0c;恢复与彻底删除…

数据特征降维 | 局部线性嵌入(LLE)

局部线性嵌入(Locally Linear Embedding,LLE)是一种非线性降维和数据嵌入技术,用于将高维数据映射到低维空间中,以便更好地展示数据的结构和关系。 LLE的基本思想是假设数据样本在局部区域内可以近似由其相邻样本的线性组合表示。通过保持这种局部线性关系,LLE能够在低维…

掌握QPainter:Qt中的绘图艺术

目录标题 1. QPainter概述2. 创建QPainter对象3. 绘制基本图形4. 绘制文本5. 绘制图像6. 使用画笔&#xff08;QPen&#xff09;7. 使用画刷&#xff08;QBrush&#xff09;8. 图形变换9. 抗锯齿与优化10. 实例代码与解析11. 总结 在Qt的世界里&#xff0c;QPainter是一位多才多…

设计模式-11 - Adapter Pattern 适配器设计模式

设计模式-11 - Adapter Pattern 适配器设计模式 1.定义 适配器模式是一种结构型设计模式&#xff0c;它允许具有不同接口的两个类一起工作。它通过创建一个适配器类来实现这一点&#xff0c;该适配器类将一个类的接口转换为另一个类所需的接口。 2.内涵 适配器设计模式的内涵…

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势&#xff0c;其市场价值不仅体现在竞赛本身&#xff0c;还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目&#xff0c;包括竞速赛、技巧赛、航拍赛等。每个项目…

Ubuntu下C++编程总结AllInOne

之前主要是在win下用VisualStudio&#xff0c;现在研究总结在ubuntu下使用CMake编程经验&#xff0c;填坑记录 目录 0. 前述1.Ubuntu下多线程使用 0. 前述 1.Ubuntu下多线程使用 出现的问题&#xff1a;undefined reference to symbol pthread_create 使用多线程&#xff0c…