1、使用注解@EnableAsync开启异步,会自动扫描
2、定义@Component、@Async作为组件被容器扫描执行
一、@Async
在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。添加了异步注解之后,项目运行时需要启动异步注解,在Application类需要添加@EnableAsync注解才能启动异步方法。
项目中如果需要开启异步调用和定时任务,就需要在入口类添加@EnableScheduling和@EnableAsync两个注解如下:
@SpringBootApplication
//定时任务开关
@EnableScheduling
//开启异步调用方法
@EnableAsync
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
二、创建定时任务
package com.mybs.tasks;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;
import java.util.concurrent.Future;
@Component
public class AsyncTask {
@Async //方法中如果没有加@Async就会是同步任务
public Future<Boolean> doTask1() throws Exception{
long start =System.currentTimeMillis();
Thread.sleep(1000);
long end=System.currentTimeMillis();
System.out.println("任务1耗时:"+(end-start)+"毫秒");
return new AsyncResult<>(true);
}
@Async
public Future<Boolean> doTask2() throws Exception{
long strat=System.currentTimeMillis();
Thread.sleep(1700);
long end=System.currentTimeMillis();
System.out.println("任务2耗时:"+(end-strat)+"毫秒");
return new AsyncResult<>(true);
}
@Async
public Future<Boolean> doTask3() throws Exception{
long strat=System.currentTimeMillis();
Thread.sleep(2000);
long end=System.currentTimeMillis();
System.out.println("任务3耗时:"+(end-strat)+"毫秒");
return new AsyncResult<>(true);
}
}
三、调用定时任务
@RestController
public class DoTask {
@Autowired
private AsyncTask asyncTask;
@RequestMapping("/test1")
public String test1() throws Exception{
long start=System.currentTimeMillis();
Future<Boolean> a=asyncTask.doTask1();
Future<Boolean> b=asyncTask.doTask2();
Future<Boolean> c=asyncTask.doTask3();
//死循环判断任务是否完成
while(!a.isDone()||!b.isDone()||!c.isDone()){
if(a.isDone()&&b.isDone()&&c.isDone()){
break;
}
}
long end=System.currentTimeMillis();
String times="任务全部完,总耗时:"+(end-start);
System.out.println(times);
return times;
}
}
启动项目:
四、异步任务的使用场景
1、发送短信 2、发送邮件 3、App消息推送 4、运维凌晨发布