Java代码三种方式实现定时执行某个方法
如果你想定时的去执行某个方法,跟着这个操作测试一下,你就会了。
有3种定时方法可以做数据同步。
第一种:
jdk提供的定时器工具Timer
1.单线程
2.可以指定延迟(开始执行的时间)、周期时间
3.可以调度指定的的需要执行的任务
/*** Timer也可以指定具体时间执行* String time = "2019-07-02 12:00:00"; * SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); * Date delay = sdf.parse(time);//执行时间* timer.scheduleAtFixedRate(执行任务, delay, 周期);*/
public void Ds01() {// 需要定时执行的任务TimerTask task = new TimerTask() {public void run() {System.out.println("-----定时测试-----");}};// Timer定时器工具Timer timer = new Timer();// 延迟(首次执行的时间)long delay = 0;// 间隔周期(/毫秒数)long intevalPeriod = 5 * 1000;// 立即执行,并且每5秒执行一次timer.scheduleAtFixedRate(task, delay, intevalPeriod);
}
第二种:最理想的定时器
1.通过线程池的方式来执行任务
2.可以设定时间颗粒度
TimeUnit.DAYS //天 TimeUnit.HOURS //小时 TimeUnit.MINUTES //分钟
TimeUnit.SECONDS //秒 TimeUnit.MILLISECONDS //毫秒 TimeUnit.NANOSECONDS //毫微秒 TimeUnit.MICROSECONDS //微秒
/*** ses.scheduleAtFixedRate(执行任务, 延迟(首次执行的时间), 周期, 延迟/周期的单位);*/
public void Ds02() {// 需要定时执行的任务Runnable runnable = new Runnable() {public void run() {System.out.println("-----定时器-----");}};ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();//立即执行,并且每5秒执行一次ses.scheduleAtFixedRate(runnable, 0, 5000, TimeUnit.MILLISECONDS);
}
第三种:SpringBoot项目中的定时器 (SpringBoot中的任务调度)
1.方便,快速
1在主启动类添加注解:@EnableScheduling //允许自动调用
@SpringBootApplication
@EnableScheduling //允许自动调用
public class ManageApplication {public static void main(String[] args) {SpringApplication.run(ManageApplication.class, args);}
}
2在需要使用任务调度的类上面加注解 @Component,使该类被Spring管理
import org.springframework.stereotype.Component;@Component
public class Ds {//方法1 {...}//方法2 {...}//....
}
3.任务调度的方法上面加注解 @Scheduled
1) cron属性:时间表达式
2) fixedRate属性:上一个调用开始后再次调用的延时(再次调用时不需要等上一个调用执行完成)
3) fixedDelay属性:上一个调用完成后再次调用的延时(再次调用时需要等上一个调用执行完成)
4) initialDelay属性:第一次调用时的延迟时间
属性 含义
fixedRate = 1000 每秒执行一次,单位毫秒
"0 0 10,14,16 * * ?" 每天10点、14点、16点 触发
"0 0/30 9-17 * * ?" 朝九晚五工作时间内每半小时触发
"0 0 12 ? * WED" 表示每个星期三中午12点触发
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class Ds {//每10秒执行一次该方法@Scheduled(fixedRate = 1000)public void test() {System.out.println("------每10秒执行一次该方法------");}//每天12点执行一次该方法@Scheduled("0 0 12 * * ?")public void test2() {System.out.println("------每天12点执行一次该方法------");}}
通常情况下,任务调度需要配合异步功能,所以类只需要再添加一个注解@EnableAsync
import org.springframework.stereotype.Component;
import org.springframework.scheduling.annotation.EnableAsync;@Component
@EnableAsync // 异步的注解
public class Ds {//每10秒执行一次该方法@Scheduled(fixedRate = 10000)public void test() {System.out.println("------每10秒执行一次该方法------");}//每天12点执行一次该方法@Scheduled("0 0 12 * * ?")public void test2() {System.out.println("------每天12点执行一次该方法------");}}
SpringBoot注解 番外篇
在这里,我重点解释下这个注解方式
如果直接把@EnableScheduling注解写到启动类中,这样的话就会很死板
所以得想个办法
不在启动类中加注解,而是通过配置文件 能人为控制定时任务的开启或关闭
进入@EnableScheduling,看到引入的 SchedulingConfiguration.class ,进去后不难发现,该类注入了ScheduledAnnotationBeanPostProcessor
知道了上面这些,所以现在我们需要做的就是通过配置来控制定时任务
手动编写一个配置类来控制(不需要方法),如下:
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.scheduling.annotation.SchedulingConfiguration;@Configuration
@ConditionalOnExpression(value = "${task.scheduling}")
@Import(SchedulingConfiguration.class)
public class TaskEnableSchedulingConfig {}
application.yml 添加个配置,通过true|false来控制 TaskEnableSchedulingConfig 这个类
# 定时任务开启状态
task:scheduling: true
这样,就能通过application.yml配置文件来控制是否要开启定时任务了。
Java代码三种方式实现定时执行某个方法相关推荐
- Mybaits plus 数据库映射java实体三种方式
前言 数据库一般是用下划线进行设计字段,Java实体一般用驼峰法设计属性.这是不成文的规定.当数据库字段映射java实体会出现问题.下面分别是数据库字段和实体属性. 解决问题三种方式 1.利用mysq ...
- 如何在SpringWEB项目或者Springboot启动时直接执行业务代码(三种方式)
我的博客原文链接 前言 通常的我们的项目开发中,经常会遇到那种在服务一启动就需要自动执行一些业务代码的情况.比如将数据库中的配置信息或者数据字典之类的缓存到redis,或者在服务启动的时候将一些配置化 ...
- apt java8_Ubuntu 18.04安装Java JDK8三种方式
Java JDK在linux系统有两个版本,一个开源版本Openjdk,还有一个oracle官方版本jdk,oracle JDK既可以通过添加ppa源命令行安装,也可以去官网下载jdk压缩包安装.下面 ...
- windows,ubuntu,代码三种方式制作Android开机动画 bootanimation.zip
一.bootanimation.zip结构 bootanimation.zip解压的目录结构,我的例子使用5张账片,总之是由(part文件夹+desc.txt) part文件夹里面存放图片,如下 de ...
- java获取系统时间的几种方法_Java篇—获取当前系统时间的三种方式(超详细+多方法)...
1.通过util包中的Date类来获取当前时间 方法1详细代码: public class Exercise17 { public static void main(String[] args){ D ...
- idea注释代码三种方式
1.单行注释(ctrl+/ ) 光标处于当前需要写注释的这一行,在这行任何位置都可以,可以调整的,ctrl+/ 即可实现单行注释,如图,当想取消时,也可以使用ctrl+/取消行注释: 2.多行注释(c ...
- C#中实现多态的三种方式:抽象类,虚方法,接口
Interface(接口):是一种规则,要求继承类必需实现所有声明的成员,方法是公开的. Virtual方法(虚方法):可以在继承类里 Override覆盖重新的方方法,有自己的方法体.派生类可使用, ...
- perl mysql dml_MySQL Connector执行SQL语句的三种方式
描述 当我们需要在Java程序中与数据库进行交互,可能首先想到的是使用某个ORM框架,因为ORM框架封装了一些实现细节,在使用上非常方便,并且一定程度上可以提升代码稳定性. 在ORM框架中,都会依赖M ...
- ajax上传多文件和数据,Ajax上传数据和上传文件(三种方式)
Ajax向后端发送数据可以有三种方式:原生Ajax方式,jQuery Ajax方式,iframe+form 方式(伪造Ajax方式) Title .btn { background-color: co ...
最新文章
- 2021-10-27 我与地坛
- 解决达梦数据库新增大字段报错问题
- 给你一天时间,如何理清AI圈儿现状?
- pta简单实现x的n次方_PTA-2017实验2.4 函数
- 清除应用程序所有缓存
- Codechef July Challenge 2018 : Subway Ride
- 狡猾无比的超级网络间谍
- CEMAPI实战攻略(四)——发送短消息
- php中等3秒再跳转,跳转和重定向
- [渝粤教育] 中国地质大学 嵌入式操作系统 复习题 (2)
- PIR 宣布被营利性机构收购,.org 顶级域名注册费用或上涨
- python爬取天气预报并发送短信_Python3爬虫教程之利用Python实现发送天气预报邮件...
- MBR磁盘分区见解笔记
- 模拟人生4极乐净土mod_如何在《模拟人生4》中下载Mod
- iOS小技能:常用预处理指令(移除程序中的identifier、发布模式关闭NSLog、导出和隐藏符号)
- 手机在泰国显示无服务器,怎么连接泰国服务器
- mc服务器称号显示插件,[聊天]UDtitle ——称号管理(仓库) 1.1.6 [全版本]
- C++中compare函数的使用
- 【机器学习】监督学习,非监督学习,半监督学习三者的定义区别及举例分析
- GIS标准分幅工具——制作图幅接合表