Scheduled如何会在上次任务执行完才会执行下次任务
更新时间:2024年08月02日 10:49:07 作者:hashdog
这篇文章主要介绍了Scheduled如何会在上次任务执行完才会执行下次任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Scheduled会在上次任务执行完才会执行下次任务
在使用spring的Scheduled定时任务
担心同一任务,
第一次开始未执行完就执行第二次任务,所以给加了synchronized,
但是后面经过测试Scheduled定时任务会在上次任务结束时再执行第二次任务,
如果第二次任务堵在哪里了,时间会顺延
package xyz.hashdog.job; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * @author th * @description: 定时任务测试 * @projectName hashdog-ds * @date 2020/2/1223:07 */ @Component @Slf4j @AllArgsConstructor public class TestCrontab { private static final Object KEY = new Object(); private static boolean taskFlag = false; @Scheduled(cron = "*/5 * * * * ?") public void pushCancel() { System.out.println("进来了"); synchronized (KEY) { if (TestCrontab.taskFlag) { System.out.println("测试调度已经启动"); log.warn("测试调度已经启动"); return; } TestCrontab.taskFlag = true; } try { for (int i =0;i<=10;i++){ System.out.println("执行:"+i); Thread.sleep(2000); } } catch (Exception e) { log.error("测试调度执行出错", e); } TestCrontab.taskFlag = false; log.warn("测试调度执行完成"); } }
注释掉synchronized
执行效果一样,并没有线程安全问题
package xyz.hashdog.job; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * @author th * @description: 定时任务测试 * @projectName hashdog-ds * @date 2020/2/1223:07 */ @Component @Slf4j @AllArgsConstructor public class TestCrontab { private static final Object KEY = new Object(); private static boolean taskFlag = false; @Scheduled(cron = "*/5 * * * * ?") public void pushCancel() throws InterruptedException { System.out.println("进来了"); // synchronized (KEY) { // if (TestCrontab.taskFlag) { // System.out.println("测试调度已经启动"); // log.warn("测试调度已经启动"); // return; // } // TestCrontab.taskFlag = true; // } // // try { for (int i =0;i<=10;i++){ System.out.println("执行:"+i); Thread.sleep(2000); } // } catch (Exception e) { // log.error("测试调度执行出错", e); // } // // TestCrontab.taskFlag = false; log.warn("测试调度执行完成"); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
使用springboot单元测试对weblistener的加载测试
这篇文章主要介绍了使用springboot单元测试对weblistener的加载测试,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10application作用域实现用户登录挤掉之前登录用户代码
这篇文章主要介绍了application作用域实现用户登录挤掉之前登录用户代码,具有一定参考价值,需要的朋友可以了解下。2017-11-11Tomcat 8.5 +mysql 5.7+jdk1.8开发JavaSE的金牌榜小项目
这篇文章主要介绍了Tomcat 8.5 +mysql 5.7+jdk1.8开发JavaSE的金牌榜小项目,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-05-05阿里资深技术专家:在各阶段中3年经验的java程序员应该具备哪些技术能力
这篇文章主要介绍了阿里资深技术专家:在各阶段中3年经验的java程序员应该具备哪些技术能力,本文给大家列举了一些内容,大家可以根据自己需要有方法的掌握,感兴趣的朋友跟随小编一起看看吧2020-07-07
最新评论