导读


由于项目需要,现在一个类中有多个定时任务,但是只能顺序执行,需要配置下让其能同时执行。

使用


原因

单个定时任务只能顺序执行,如下:

  1. import org.springframework.scheduling.annotation.Async;
  2. import org.springframework.scheduling.annotation.Scheduled;
  3. import org.springframework.stereotype.Component;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. @Component
  7. @Async
  8. public class Sche {
  9. /**
  10. * 每隔1s执行一次
  11. */
  12. @Scheduled(cron = "0/1 * * * * ?")
  13. public static void pushPreNodeData() {
  14. System.out.println("测试每10s执行定时任务~");
  15. }
  16. /**
  17. * 指定时间执行一次,这里指定2020-04-10 16:37:00分执行
  18. * @throws InterruptedException
  19. */
  20. @Scheduled(cron = "0 37 16 10 4 ?")
  21. public void pushssPreNodeData() throws InterruptedException {
  22. Calendar date = Calendar.getInstance();
  23. String year = String.valueOf(date.get(Calendar.YEAR));
  24. if ("2020".equals(year)) {
  25. while (true) {
  26. //休眠2s
  27. Thread.sleep(2000);
  28. System.out.println("哈哈哈~" + new Date());
  29. }
  30. }
  31. }
  32. }
  • 控制台如下:

image.png

  • 此时只能单个定时任务执行,不能同时执行。如果一个没有执行完,另一个定时任务是不能同时执行的。

注意:启动类需要开启定时任务,需要添加注解 @EnableScheduling

解决办法

简单理解由于是单线程的,其不能同时执行。如果一个没有执行完,另一个定时任务是不能执行的。

如果想同事执行,可以在这里可以在启动类添加 TaskScheduler ,再次启动就可以同时执行了。

  1. @Bean
  2. public TaskScheduler taskScheduler() {
  3. ThreadPoolTaskScheduler taskExecutor = new ThreadPoolTaskScheduler();
  4. taskExecutor.setPoolSize(30);
  5. return taskExecutor;
  6. }
  • 控制台如下

image.png

搞定~

END


来自大佬的定时器框架demo,贼牛皮。
qyartzdemo.7z