一、
先说一种Java自带的java.util包里的计时器Timer类,线程调度任务以供将来在后台线程中执行的功能。任务可以安排一次执行,或定期重复执行。
在进行Timer对象的新建时,Timer提供了多种有参构造和无参构造,主要区别就是是否将该线程定义为守护线程,守护线程即为随着主线程停止销毁而该线程停止销毁,无参构造默认定义为非守护线程,也就是说即使程序执行完成,该线程仍存在。
Timer是调度器,用来调用TimerTask调度任务。Timer的方法有以下

下面的代码使用了Timer来计时,并将输出的打印结果贴在下面
/**
* @author Edwin
* @date 2021/1/25 12:34
* @description Timer计时器演示
**/
@Slf4j
public class TestTimerTool {
public static void main(String[] args) {
log.info("进入主函数...");
//定时五秒执行TimerTask中的任务
timerTool(5000L);
System.out.println("TestTimerTool类中的输出...");
}
/**
* 计时器
* @param delayTime delayTime
*/
public static void timerTool(Long delayTime){
log.info("进入计时器...");
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
startOrder("String shName");
System.out.println("timerTool方法中的输入...");
}
};
timer.schedule(timerTask, delayTime);
}
/**
* 定时执行的function
*/
public static void startOrder(String shName){
log.info("定时任务执行中...");
System.out.println("任务输出..." + shName);
}
}

二、
spring boot自带的定时调度,使用注解来完成。该方法只适合比较简单的定时调度任务,不适合处理分布式任务。但是大部分简单的调度任务还是都可以完成的,并且用法也比较简单。
实现主要由两个注解来完成
@EnableScheduling,要想进行定时调度功能,首先需要在boot启动类上添加此注解,我理解的是@EnableScheduling用来给你的项目注入这个功能的使用权
@Scheduled,主要用来完成定时调度动作的注解,其比较重要的配置有cron,fixedRate,fixedDelay
1.cron:用来定义调度的周期或时间,cron是@Scheduled的一个参数,cron是一个字符串,以5个空格隔开,只允许6个域,分别表示秒,分,时,日,月,周.简单举了三个例子
@Scheduled(cron = “0 0 5 * * ?”) 每天五点执行定时任务
@Scheduled(cron = “0 30 5 * * ?”) 每天五点半执行定时任务
@Scheduled(cron = “0 30 5 ? * 1”) 每周一五点半执行定时任务,这里的星期也可以用英文单词表示分别是:MON、TUE、WED、THU、FRI、SAT、SUN
2.fixedRate:间隔多长时间执行一次,也就是表示自上一次执行开始后多长时间再次执行,ms为单位 1000 * 60 = 一分钟
@Scheduled(fixedRate = 1000 * 60 * 5),每隔五分钟执行一次,前一个任务开始后就计时
3.fixedDelay:与fixedRate类似,fixedDelay表示自上一次执行结束后多长时间再次执行,fixedRate是任务开始就计时,fixedDelay是任务结束才开始计时
@Scheduled(fixedDelay = 1000 * 60 * 5),前一个任务结束后开始计时五分钟,执行下一次任务
我的代码里用到的是间隔多久执行一下,所以用了 fixedRate。
主函数上面需要加@EnableScheduling注解
@SpringBootApplication
@EnableScheduling
public class CollectApplication {
public static void main(String[] args) {
SpringApplication.run(CollectApplication.class, args);
}
}
同时,在你的定时执行任务类上不要忘记加@Component注解,将此类注入到spring容器中。
@Slf4j
@Component
public class SchedulingTasks {
private static final int ONE_MINUTE = 1000 * 60;
/**
* 调度执行的目标方法
*/
//每十分钟执行一次
@Scheduled(fixedRate = ONE_MINUTE * 10)
public void schedulingTask(){
log.info("进入定时调度任务...");
//定时执行的业务代码
}
}
这两种方法还是比较简单的,当然也有很多局限性。还有一个Quartz实现定时任务,都在这篇写完篇幅会有些长,所以下一篇讲Quartz做定时调度和spring boot整合Quartz。
点关注 不迷路,一起解决更多问题,微信公众号:非定义式程序员