下面讲的是springboot + @scheduled 多任务并发,spring的定时任务(包括多任务并发)详解参见
一、问题
项目采用springboot搭建,想给方法添加@Scheduled注解,实现两个定时任务。可是运行发现,两个task并没有并发执行,而是执行完一个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@EnableSchedulingpublic 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(); } } }}
运行发现任务没有并行执行。
二、解决
@Component@Configurable@EnableScheduling@EnableAsyncpublic 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(); } } }}给类添加注解@EnableAsync,并给方法添加注解@Async。
再次运行,发现两个任务可以并发执行了。