Springboot中上一个定时任务没执行完,是否会影响下一个定时任务执行分析及结论

本文探讨了Springboot中定时任务的执行情况,指出默认情况下,单线程定时任务会因上一个任务未完成而阻塞。通过示例展示了不同定时任务和多线程执行的情况。实现`TaskExecutor`接口可使任务在不同线程中运行,避免阻塞。总结了如何通过线程池处理任务来防止阻塞。
摘要由CSDN通过智能技术生成

本文将用测试代码验证:定时任务阻塞问题

在springboot中使用定时任务的步骤

  1. 在启动类上加上注解:@EnableScheduling,表示允许定时任务执行

  2. 定时任务需要在类上加上@Component或者其衍生类(Controller、Service等),用于纳入Spring容器管理。

  3. 在需要定时任务方法上增加注解@Scheduled,注解的参数是定时任务执行时机

首先需要知道:定时任务默认是单线程的。所以默认情况下,上一个定时任务没有执行完,下一个定时任务是不会开始的。

单线程定时任务

1. 示例1,最简单的例子

// 示例代码:最简单的定时任务
@Scheduled(cron = "0/1 * * * * ?")
public void test1() {
    // 每秒执行一次
    System.out.println("scheduler1 执行: " + Thread.currentThread() + "-" + DateTime.now());
}

如上方法,定时任务是每隔1s触发一次。

2. 示例2,验证定时任务阻塞

但是如果定时任务执行时间超过1s,下一个定时任务会被阻塞,直到上一个定时任务被执行完。

// 示例代码:验证定时任务阻塞问题
@Scheduled(cron = "0/1 * * * * ?")
public void test1() {
    // 每秒执行一次
    System.out.println("scheduler1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    try {
        Thread.sleep(5*1000);  // 5s
    } catch (Exception e) {
        System.out.println(e.toString());
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值