Springboot 中@Scheduled 定时任务实现多任务并发

场景:

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

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,方法的该调用将异步发生。

   官网对@Async注释的解析 https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html

         所述@Async注释可以被提供在一个方法,使方法的该调用将异步发生。换句话说,调用者将在调用时立即返回,并且该方法的实际执行将在已提交给Spring的任务中发生TaskExecutor。在最简单的情况下,注释可以应用于 - void返回方法。

@Async
 void doSomething(){
     //这将以异步方式执行 
}

与使用注释注释的方法不同 @Scheduled,这些方法可以期望参数,因为它们将在运行时由调用者以“正常”方式调用,而不是由容器管理的调度任务调用。例如,以下是@Async注释的合法应用程序。

@Async
 void doSomething(String s){
     //这将以异步方式执行 
}

 甚至可以异步调用返回值的方法。但是,这些方法需要具有 Future类型化的返回值。这仍然提供了异步执行的好处,以便调用者可以在调用get()Future 之前执行其他任务。

@Async 
Future  returnSomething( int i){
     //这将以异步方式执行 
}
@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();
             }
         }
     }
}

 

你可能感兴趣的:(Springboot 中@Scheduled 定时任务实现多任务并发)