@Scheduled注解

@Scheduled注解是spring boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行.配置@Scheduled主要有三种配置执行时间的方式(cron/fixedRate/fixedDelay)。它的配置一共有8个参数,需要配合@EnableScheduling注解使用(在启动类上,声明 @EnableScheduling,表示开启定时任务)。

cron表达式

该参数接收一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。
语法:

[秒] [分] [小时] [日] [月] [周] [年]

常用通配符说明
*:表示所有值。 例如:在分的字段上设置 *,表示每一分钟都会触发。
?:表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为”?” 具体设置为 0 0 0 10 * ?

注:[年]不是必须的域,可以省略[年],则一共6个域

例如:@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨一点各执行一次(使用的时候直接放在定时任务方法上即可)

fixedRate

该配置表示上一次执行时间后距离多长时间再执行;
例如:

@Scheduled(fixedRate = 5000) //上一次开始执行时间点之后5秒再执行
@Scheduled(fixedRate = 1000 * 10) //10秒发送一次

与cron表达式区别:该配置在实际使用中(本地配置后),重启tomcat即可生效;而cron表达式只能等到约定时间后才能生效;

fixedDelay

上一次执行完毕时间点之后多长时间再执行。

@Scheduled(fixedDelay = 5000)

详细可看这个贴子 Spring中定时任务@Schedule注解的使用

实现定时任务的其他方式

1、Timer
实现如下:

public class MyTimerTask {    
    public static void main(String[] args) {        
        // 定义一个任务       
        TimerTask timerTask = new TimerTask() {            
        @Override            
            public void run() {                
            System.out.println("打印当前时间:" + new Date());    
            }       
         };        
        // 计时器       
        Timer timer = new Timer();       
        // 开始执行任务 (延迟1000毫秒执行,每3000毫秒执行一次)        
        timer.schedule(timerTask, 1000, 3000);    
    }
}

优点: 使用简单;
缺点: 前面任务的执行用时和异常会影响到后面任务;

2、ScheduledExecutorService
ScheduledExecutorService 也是Java自带的类,它可以实现Timer具备的所有功能,并解决了 Timer类存在的问题。
实现如下:

public class MyScheduledExecutorService {    
    public static void main(String[] args) {        
        // 创建任务队列   10 为线程数量      
        ScheduledExecutorService scheduledExecutorService = 
                Executors.newScheduledThreadPool(10); 
        // 执行任务      
        scheduledExecutorService.scheduleAtFixedRate(() -> {          
            System.out.println("打印当前时间:" + new Date());      
        }, 1, 3, TimeUnit.SECONDS); // 1s 后开始执行,每 3s 执行一次   
 
  }
}

ScheduledExecutorService 优缺点分析
优点是:该类是JDK1.5自带的类,使用简单,
缺点:是该方案仅适用于单机环境。

详情可见 Java 定时任务-最简单的3种实现方法

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐