「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」
前言
兄弟们,作为一个前后端都要开发的菜鸟,学习的时候也要前后端知识都兼顾哦!今天想起了了定时任务这个点,实际开发中目前还没使用过,但是这个应该是必备的知识点吧!
定时任务的写法
Timer
JDK自带的定时任务执行类;
优点:使用方便;
缺点:一个任务异常会影响其它任务执行;一个任务执行时间过长会导致其它任务延迟;
代码实现:
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimeTask {
public static void main(String[] args){
//定义一个定时任务
TimerTask timeTask = new TimerTask(){
@Override
public void run() {
System.out.println("定时输出"+ new Date());
}
};
// 计时器
Timer timer = new Timer();
// 添加执行任务(延迟1s执行,每3s执行一次)
timer.schedule(timeTask,1000,3000);
}
}
ScheduledExecutorService
JDK1.5自带的API;
优点:相对于Timer的单线程,ScheduledExecutorServie使用线程池的方式来执行任务,不会出现任务之间的互相影响;
缺点:不能设定具体的时间和频率,比如每个周五下午六点定时执行某某任务,它就不能实现;
代码实现:
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledTask {
public static void main(String[] args){
//创建任务队列
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);//10为线程数量
//执行任务
scheduledExecutorService.scheduleAtFixedRate(() ->{
System.out.println("run schedule: " + new Date());
},1,3, TimeUnit.SECONDS);//1s后开始执行,每3s执行一次
}
}
Spring Task
Spring FrameWork 自带的定时任务;
优点:可以设定具体时间,自动触发无需手动干预;
缺点:单线程,不能做数据存储型的定时任务;
代码实现:
Spring boot的启动类上加注解:@EnableScheduling;
实现类上添加注解:@Component,把类托管给Spring;
定时任务的添加只需要注解:@Scheduled,用cron表达式声明执行频率和规则;
@SpringBootApplication
@EnableScheduling //开启定时任务
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
System.out.println("这是一个测试");
}
}
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component //把此类托管给Spring 不能省略
public class SpringTask {
//添加定时任务
/**
* Spring Task 无需手动干预,SpringBoot启动后会自动加载并执行定时任务
* cron表达式用来声明执行的频率和规则
*/
@Scheduled(cron = "0 42 9 * * ?")
public void doTask(){
System.out.println("我是定时任务");
}
}
总结
以上这几种方式都是比较基础的,进阶一些的方式加下来会继续探索~