Java定时任务

一、java.util.Timer

java.util.Timer 类允许您在未来的某个时间执行一个任务,或者在一定的时间间隔执行任务。您可以创建一个 Timer 实例,并调用其 schedule() 方法来安排任务的执行。这种方式比较简单,但在高并发环境下可能不够灵活。

1.代码实现

Timer timer = new Timer();//延迟1s,每个2s打印一次timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("111111111111");}}, 1000,2000);

2.常用方法

Timer 常用方法

二、java.util.concurrent.Executors

Java 提供了 ExecutorService 和 ScheduledExecutorService 接口,以及一些工厂方法来创建线程池和调度执行任务。ScheduledExecutorService 可以用于执行延迟任务或周期性任务。

1.代码实现

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleAtFixedRate(()->{System.out.println("1111111");
},1,2, TimeUnit.SECONDS);

2.常用方法

在这里插入图片描述

三、Spring Framework 定时任务

1.启用定时任务功能:

在配置类上添加 @EnableScheduling 注解,以启用 Spring 的定时任务功能。

@SpringBootApplication
@EnableScheduling
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}

2.创建定时任务方法:

在 Spring 管理的 Bean 类中定义一个方法,并使用 @Scheduled 注解标记该方法作为定时任务。可以指定定时任务的触发时间、频率等。

@RestController
public class ScheduledTasksController {@Scheduled(cron = "0 30 9 * * ?")//每天九点半执行public void task1(){System.out.println("111111111");}@Scheduled(fixedRate = 5000)//每个5s执行public void task2(){System.out.println("222222222");}
}

3.cron表达式

每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天22点执行一次:0 0 22 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天21点执行一次:0 0 21 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在12分、13分、14分执行一次:0 12,13,14 * * * ?
每天的0点、3点、5点、7点都执行一次:0 0 0, 3,5,7 * * ?
Java检测cron表达式
先引入quartz的jar包

<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version>
</dependency>

检测代码

boolean validExpression = CronExpression.isValidExpression(cron);
if (validExpression) {//cron验证通过
} else {//cron颜值失败
}

四、动态配置定时时间

1.通过yml配置:

问题: 每次修改时间都需要重新启动服务;

@Component
@Slf4j
public class DynamicScheduledTaskRegistrar {@Resourceprivate TaskScheduler taskScheduler;@Value("${schedule.cron}")private String cronExpression;@PostConstructpublic void init() {scheduleTask();}private void scheduleTask() {Runnable task = () -> {//业务逻辑};Trigger trigger = new CronTrigger(cronExpression);taskScheduler.schedule(task, trigger);}
}

2.通过set动态配置

方式一
@Component
@Slf4j
public class DynamicScheduledTaskRegistrar {@Resourceprivate TaskScheduler taskScheduler;private ScheduledFuture<?> scheduledFuture;private String cronExpression = "*/10 * * * * *"; // 默认的cron表达式@PostConstructpublic void init() {scheduleTask();}private void scheduleTask() {Runnable task = () -> {// 这里写你的定时任务逻辑System.out.println("执行定时任务");};Trigger trigger = new CronTrigger(cronExpression);scheduledFuture = taskScheduler.schedule(task, trigger);}public void setCronExpression(String newCronExpression) {this.cronExpression = newCronExpression;// 取消之前的定时任务并重新调度if (scheduledFuture != null && !scheduledFuture.isCancelled()) {scheduledFuture.cancel(true);}scheduleTask();}
}
方式二

1.首先配置taskScheduler

@Configuration
@EnableScheduling
public class SchedulingConfig {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(10); // 设置线程池大小scheduler.setThreadNamePrefix("ScheduledTask-");scheduler.initialize();return scheduler;}
}

2.实现SchedulingConfigurer

@Component
@Slf4j
public class DynamicScheduledTask implements SchedulingConfigurer {private String cronExpression = ""; //cron 表达式private ScheduledFuture<?> scheduledFuture;private final TaskScheduler taskScheduler;public DynamicScheduledTask(TaskScheduler taskScheduler) {this.taskScheduler = taskScheduler;}@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {scheduledFuture = taskScheduler.schedule(this::executeTask, new CronTrigger(cronExpression));}public void setCronExpression(String cronExpression) {this.cronExpression = cronExpression;// 根据新的 cron 表达式重新调度任务scheduledFuture.cancel(false);scheduledFuture = taskScheduler.schedule(this::executeTask, new CronTrigger(cronExpression));}public void executeTask() {// 定时任务执行的操作System.out.println("执行定时任务");}
}

不足之处望海涵

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

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

相关文章

放大招,推广手机流量卡,佣金丰厚等你来拿

流量卡推广是一个非常冷门但又在身边非常常见的行业&#xff0c;知道的人目前靠着这个信息&#xff0c;发了很多小财&#xff0c;可以说早知道这一行的人会非常容易变成暴发户。 你可能也会好奇&#xff0c;为什么那么多广告都是在推流量卡&#xff0c;他们推卡到底有多高的利…

将gidp模块、ipam集成到ultralytics项目中实现gidp-yolov8、ipam-yolov8

gdip-yolo与ia-seg都是一种将图像自适应模块插入模型前面,从而提升模型在特定数据下检测能力的网络结构。gdip-yolo提出了gdip模块,可以应用到大雾数据与低亮度数据(夜晚环境),然后用于目标检测训练;ia-seg将ia-yolo中的代码修改了一下修车了ipam模块,应用到低亮度数据(…

数据库技术基础

根据希赛相关视频课程汇总整理而成&#xff0c;个人笔记&#xff0c;仅供参考。 基本概念 数据库通常是指有组织地、动态地存储在&#xff08;外存上的相互联系的数据的集合&#xff09;应用数据库主要目的是解决数据&#xff08;共享&#xff09;问题。 三级模式/两级映像&a…

【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题

文章目录 一、什么是时间复杂度和空间复杂度&#xff1f;1.1 算法效率1.2 时间复杂度的概念1.3 空间复杂度的概念1.4 复杂度计算在算法中的意义 二、时间复杂度的计算2.1 大O渐进表示法2.2 常见时间复杂度计算举例 三、空间复杂度的计算四、Leetcode刷题1. 消失的数2. 旋转数组…

代理服务器端口分配测试

上游服务器需要一个短暂或临时端口请求下游服务器&#xff0c;测试端口分配方式。 参考nginx 摘录-腾讯云开发者社区-腾讯云 框架为 <dependency><groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</ar…

一些docker安装配置以及常见命令

​常用命令 docker 命令 //进去容器内部&#xff0c;找到需要拷贝的文件及目录 docker exec -it 2c2600fb60f8 /bin/bash ​ //将container id为4db8edd86202的容器内elasticsearch.yml文件拷贝到宿主机指定目录下&#xff1a; docker cp 4db8edd86202:/usr/share/elasticsea…

git出现错误 fail to push some refs to “xxx“

问题产生原因&#xff1a;根据测试猜测造成这一错误的原因是在码云的远程仓库上删除了一个文件,本地没有pull下来,直接进行了commit,commit到本地仓库后,如果在pull下来,也是无法提交的 问题解决办法: 使用 git pull --rebase,拉取远程仓库,并将本地仓库新的提交作为最顶层的提…

张大哥笔记:电脑周边的10大刚需创业小项目

hello&#xff0c;大家好&#xff0c;我是张大哥&#xff0c;今天一口气给大家分享围绕电脑周边的10大刚需创业小项目&#xff0c;本文章旨在帮助大家如何快速切入到细分领域里面搞钱&#xff01; 如何赚钱&#xff0c;无非就是解决人群痛点&#xff0c;你要懂得根据用户痛点去…

实现 Table 的增加和删除,不依赖后端数据回显

需求 删除前 删除后 分析 首先写一个 Table <a-card style"width:100%"><template#extra><a-button type"text" click"addSelectItem" style"margin-right: 5px">添加</a-button><a-button type&quo…

融合创新!全局特征+局部特征,性能优于Transformer

在图像处理领域&#xff0c;全局特征和局部特征融合是一种常见且十分高效的策略&#xff0c;用于提高图像分析和识别任务的性能。 全局特征反映了图像的整体属性&#xff0c;如颜色分布、形状轮廓等&#xff0c;它们通常对图像的尺度和旋转具有不变性。 局部特征关注于图像中特…

python 如何获得重定向输入

通过内置的fileinput模块即可实现&#xff0c;创建文件filein.py&#xff1a; #!/usr/bin/env python import fileinput f_input fileinput.input() for line in f_input:print(line, end)增加可执行权限&#xff1a; chmod ax filein.py 使用&#xff1a; $ ls | ./filein.py…

Latex学习(从入门到入土)2

第一章 &#xff1a;插图 在LaTeX中插入插图可以通过graphicx宏包来实现&#xff0c;这个宏包提供了强大的图像处理功能。以下是如何使用graphicx宏包插入图像的基本步骤&#xff1a; ### 1. 加载宏包 在文档的序言部分&#xff08;\begin{document}之前&#xff09;&#x…

Pr2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Premiere简称“Pr”&#xff0c;是一款超强大的视频编辑软件&#xff0c;它可以提升您的创作能力和创作自由度&#xff0c;它是易学、高效、精确的视频剪辑软件&#xff0c;提供了采集、剪辑、调色、美化音频、字幕添加、输出、D…

贝锐蒲公英自研异地组网新技术:远程视频监控,流畅度、清晰度大幅提升

在远程视频监控过程中&#xff0c;若遇到网络带宽若遇到网络波动&#xff0c;如&#xff1a;丢包、高延迟等&#xff0c;往往会导致视频流传输时发生数据丢失或延迟现象&#xff0c;从而严重影响视频画面的清晰度和流畅度。 比如&#xff1a;在公司总部集中监看远程矿山或户外水…

Unity 点击次数统计功能

介绍 &#x1f4a1;.调用方便&#xff0c;发生点击事件后直接通过"xxx".CacheClick缓存 &#x1f4a1;. 在允许的时间间隔内再次点击会累计点击次数&#xff0c;直到超出后触发事件 传送门&#x1f448;

Element入门

安装ElementUI组件库 npm install element-ui2.15.3 引入 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.use(ElementUI);new Vue({el: #app,render: h > h(App) }); 应用 模板 …

一篇文章带你快速认识边缘计算(必看)

引言 5G时代带来了万物互联的飞跃&#xff0c;但随之而来的是数据量爆炸性增长与集中式数据中心处理模式的瓶颈&#xff1a;响应延迟、带宽压力、安全隐忧。边缘计算应运而生&#xff0c;借鉴生物智能分布式原理&#xff0c;将计算与分析推向数据源头&#xff0c;有效解决了以上…

Linux的重要命令(一)

目录 一.查看当前的工作目录-pwd 二.切换工作目录-cd 三.列表显示目录内容或文件本身-ls 四.通配符 通配符用法 五.设置别名-alias 六.统计文件或目录空间占用情况 七.创建新目录-mkdir 八.创建新文件-touch 九.创建链接文件-ln 十.复制文件或目录 十一.删除文件或目…

通过抖音短视频获客 只需要六步

抖音是当前最受欢迎的短视频平台之一&#xff0c;拥有庞大的用户群体和强大的社交矩阵&#xff0c;已经成为企业打造品牌口碑和快速获客的一种有效方式。那么&#xff0c;如何利用抖音短视频快速获客&#xff0c;打造品牌口碑呢&#xff1f;小马识途营销顾问简要分析如下&#…

文件操作;

目录 1.文件的打开与关闭&#xff1b; 打开文件&#xff1b; 关闭文件&#xff1b; 2.文件的打开方式&#xff1b; “r”&#xff08;只读&#xff09;&#xff1b; “w”&#xff08;只写&#xff09;&#xff1b; 3.文件的顺序读写&#xff1b; 字符输入函数fgetc 代…