Spring boot+ scheduled定时任务及多任务并发

刚刚看了下Spring Boot实现定时任务的文章,感觉还不错。Spring Boot 使用Spring自带的Schedule来实现定时任务变得非常简单和方便。在这里个大家分享下

开启scheduler支持

@SpringBootApplication
@EnableScheduling
public class Application{
    public static void mian(String[] args){
        SpringApplication.run(Application.class,args);
    }
}

编写定时任务

第一种 定时执行

@Component
public class ScheduledTask {

    @Scheduled(cron = "*/5 * * * * ?")
    public void task1() throws InterruptedException {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "    " + Thread.currentThread().getName() + "    任务一启动");
        Thread.sleep(10000);//任务耗时10秒
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "    " + Thread.currentThread().getName() + "    结束");

    }

    @Scheduled(cron = "*/5 * * * * ?")
    public void task2() throws InterruptedException {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "    " + Thread.currentThread().getName() + "    任务二启动");
        Thread.sleep(10000);
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "    " + Thread.currentThread().getName() + "    结束");
    }
}

#运行结果
2019-04-25 11:27:40    pool-1-thread-1    任务一启动
2019-04-25 11:27:50    pool-1-thread-1    任务一结束
2019-04-25 11:27:50    pool-1-thread-1    任务二启动
2019-04-25 11:28:00    pool-1-thread-1    任务二结束
2019-04-25 11:28:00    pool-1-thread-1    任务一启动
2019-04-25 11:28:10    pool-1-thread-1    任务一结束
2019-04-25 11:28:10    pool-1-thread-1    任务二启动

cron可以参考[cron参数详解]
(https://www.jianshu.com/p/09150a256269)

通过运行结果可以发现,任务一和任务二是线性依次执行的,所有的任务都是在同一个线程池中的同一个线程来完成的

第二种 间隔执行

//每个5000毫秒执行一次
@Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        System.out.println("每隔五秒钟执行一次: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

任务并发执行配置

那么,怎么设计成多线程实现并发呢?在网上看到过这样的解决方案。通过ScheduleConfig配置文件实现SchedulingConfigurer接口,并重写setScheduler方法

@Component
public class ScheduledConfig implements SchedulingConfigurer {
    
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(TaskScheduler());
    }
    
    @Bean(destroyMethod = "shutdown")
    public Executor TaskScheduler() {
        return Executors.newScheduledThreadPool(10);
    }
}

2019-04-25 14:10:20    pool-2-thread-2    任务二启动
2019-04-25 14:10:20    pool-2-thread-1    任务一启动
2019-04-25 14:10:30    pool-2-thread-2    任务二结束
2019-04-25 14:10:30    pool-2-thread-1    任务一结束
2019-04-25 14:10:35    pool-2-thread-1    任务一启动
2019-04-25 14:10:35    pool-2-thread-2    任务二启动

通过运行结果可以看出,两个任务可以同时执行,同一个任务不会并发执行(对于同一个任务,上一个执行完后,再进行下一次任务,可以看出两个任务都是过了10秒执行完后,等待5秒再次执行,而不是固定的5秒一次)

对于同一个任务也想要并发执行可以加上@Async注解,思路就是使任务执行也是异步即可

你可能感兴趣的:(Spring boot+ scheduled定时任务及多任务并发)