当前位置:   article > 正文

Scheduled会在上次任务执行完才会执行下次任务_定时任务等上个结束在执行

定时任务等上个结束在执行

 在使用spring的Scheduled定时任务,担心同一任务,第一次开始未执行完就执行第二次任务,所以给加了synchronized,但是后面经过测试Scheduled定时任务会在上次任务结束时再执行第二次任务,如果第二次任务堵在哪里了,时间会顺延

 

  1. package xyz.hashdog.job;
  2. import lombok.AllArgsConstructor;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.scheduling.annotation.Scheduled;
  5. import org.springframework.stereotype.Component;
  6. /**
  7. * @author th
  8. * @description: 定时任务测试
  9. * @projectName hashdog-ds
  10. * @date 2020/2/1223:07
  11. */
  12. @Component
  13. @Slf4j
  14. @AllArgsConstructor
  15. public class TestCrontab {
  16. private static final Object KEY = new Object();
  17. private static boolean taskFlag = false;
  18. @Scheduled(cron = "*/5 * * * * ?")
  19. public void pushCancel() {
  20. System.out.println("进来了");
  21. synchronized (KEY) {
  22. if (TestCrontab.taskFlag) {
  23. System.out.println("测试调度已经启动");
  24. log.warn("测试调度已经启动");
  25. return;
  26. }
  27. TestCrontab.taskFlag = true;
  28. }
  29. try {
  30. for (int i =0;i<=10;i++){
  31. System.out.println("执行:"+i);
  32. Thread.sleep(2000);
  33. }
  34. } catch (Exception e) {
  35. log.error("测试调度执行出错", e);
  36. }
  37. TestCrontab.taskFlag = false;
  38. log.warn("测试调度执行完成");
  39. }
  40. }

 注释掉synchronized,执行效果一样,并没有线程安全问题

  1. package xyz.hashdog.job;
  2. import lombok.AllArgsConstructor;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.scheduling.annotation.Scheduled;
  5. import org.springframework.stereotype.Component;
  6. /**
  7. * @author th
  8. * @description: 定时任务测试
  9. * @projectName hashdog-ds
  10. * @date 2020/2/1223:07
  11. */
  12. @Component
  13. @Slf4j
  14. @AllArgsConstructor
  15. public class TestCrontab {
  16. private static final Object KEY = new Object();
  17. private static boolean taskFlag = false;
  18. @Scheduled(cron = "*/5 * * * * ?")
  19. public void pushCancel() throws InterruptedException {
  20. System.out.println("进来了");
  21. // synchronized (KEY) {
  22. // if (TestCrontab.taskFlag) {
  23. // System.out.println("测试调度已经启动");
  24. // log.warn("测试调度已经启动");
  25. // return;
  26. // }
  27. // TestCrontab.taskFlag = true;
  28. // }
  29. //
  30. // try {
  31. for (int i =0;i<=10;i++){
  32. System.out.println("执行:"+i);
  33. Thread.sleep(2000);
  34. }
  35. // } catch (Exception e) {
  36. // log.error("测试调度执行出错", e);
  37. // }
  38. //
  39. // TestCrontab.taskFlag = false;
  40. log.warn("测试调度执行完成");
  41. }
  42. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/728252
推荐阅读
  

闽ICP备14008679号