Spring boot 基于注解(@Scheduled)的定时任务是单线程的

面试题:Spring boot一个类里面写了三个定时任务 三个定时任务没有任何关系 都是一秒执行一次,其中有一个超时了,另外两个也超时了,是什么原因呢?

直接上代码

@Configuration
@EnableScheduling
public class TestScheduleTask {

    @Scheduled(cron = "0/1 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void task1() throws InterruptedException {
        System.err.println("task1执行静态定时任务时间: " + LocalDateTime.now());
        Thread.sleep(1000000);
    }

    @Scheduled(cron = "0/1 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void task2() throws InterruptedException{
        System.err.println("task2执行静态定时任务时间: " + LocalDateTime.now());
    }

    @Scheduled(cron = "0/1 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void task3() {
        System.err.println("task3执行静态定时任务时间: " + LocalDateTime.now());
    }

}

代码执行结果:

Spring boot 基于注解(@Scheduled)的定时任务是单线程的_第1张图片

结果分析:

由于第一个定时任务超时了,后面的两个定时任务没有得到执行,证明SpringBoot的定时任务时单线程的,真的是这样的吗?

再设计一个程序佐证一下上面的猜想:

@Configuration
@EnableScheduling
public class TestScheduleTask {

    private int counter = 0;

    @Scheduled(cron = "0/5 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void task1()  {
        System.err.println("task1执行静态定时任务时间: " + LocalDateTime.now());
        counter++;
        System.out.println("task1 result----"+counter);

    }

    @Scheduled(cron = "0/5 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void task2() {
        System.err.println("task2执行静态定时任务时间: " + LocalDateTime.now());
        counter++;
        System.out.println("task2 result----"+counter);
    }

    @Scheduled(cron = "0/5 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void task3() {
        System.err.println("task3执行静态定时任务时间: " + LocalDateTime.now());
        counter++;
        System.out.println("task3 result----"+counter);
    }

}

代码执行结果:

Spring boot 基于注解(@Scheduled)的定时任务是单线程的_第2张图片

 结果分析:

代码执行结果呈现出很好的顺序性,counter的值以此递增

在上一段代码:

@Configuration
@EnableScheduling
public class TestScheduleTask {

    private int counter = 0;

    @Scheduled(cron = "0/1 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void task1()  {
        System.err.println("task1执行静态定时任务时间: " + LocalDateTime.now());
        counter++;
        System.out.println("task1 result----"+counter);

    }

    @Scheduled(cron = "0/2 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void task2() {
        System.err.println("task2执行静态定时任务时间: " + LocalDateTime.now());
        counter++;
        System.out.println("task2 result----"+counter);
    }

    @Scheduled(cron = "0/3 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void task3() {
        System.err.println("task3执行静态定时任务时间: " + LocalDateTime.now());
        counter++;
        System.out.println("task3 result----"+counter);
    }

}

执行结果:

Spring boot 基于注解(@Scheduled)的定时任务是单线程的_第3张图片

 结果分析:

counter的值线性递增,不存在并发问题

参考文档:springboot定时任务_@lehao的博客-CSDN博客_springboot定时任务

你可能感兴趣的:(spring,boot,java,spring)