你会写定时任务吗?

542 阅读2分钟

「这是我参与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("我是定时任务");
    }
}

总结

以上这几种方式都是比较基础的,进阶一些的方式加下来会继续探索~