springboot + @scheduled 多任务并发

一、问题


项目采用springboot搭建,想给方法添加@Scheduled注解,实现两个定时任务。可是运行发现,两个task并没有并发执行,而是执行完一个task才会执行另外一个。上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.autohome.contentplatform.tasks;
 
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
@Component
@Configurable
@EnableScheduling
public class task1 {
     @Scheduled(cron = "0/5 * *  * * ? ")
     public void startSchedule() {
         System.out.println("===========1=>");
         try {
             for(int i=1;i<=10;i++){
                 System.out.println("=1==>"+i);
                 Thread.sleep(1000);
             }
         catch (InterruptedException e) {
             e.printStackTrace();
         }
     }
     @Scheduled(cron = "0/5 * *  * * ? ")
     public void startSchedule2() {
         for(int i=1;i<=10;i++){
             System.out.println("=2==>"+i);
             try {
                 Thread.sleep(1000);
             catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
     }
}

 

运行发现任务没有并行执行。

二、解决


给类添加注解@EnableAsync,并给方法添加注解@Async。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Component
@Configurable
@EnableScheduling
@EnableAsync
public class DemoTask {
     @Async
     @Scheduled(cron = "0/5 * *  * * ? ")
     public void startSchedule() {
         System.out.println("===========1=>");
         try {
             for(int i=1;i<=10;i++){
                 System.out.println("=1==>"+i);
                 Thread.sleep(1000);
             }
         catch (InterruptedException e) {
             e.printStackTrace();
         }
     }
 
    @Async
     @Scheduled(cron = "0/5 * *  * * ? ")
     public void startSchedule2() {
         for(int i=1;i<=10;i++){
             System.out.println("=2==>"+i);
             try {
                 Thread.sleep(1000);
             catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
     }
}

 

再次运行,发现两个任务可以并发执行了。

三、参考资料:

https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html

 






    本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/p/8085654.html,如需转载请自行联系原作者



上一篇:P4707 重返现世 题解


下一篇:《Total Commander:万能文件管理器》——第4.6节.附录:文章更新历史