使用方法。
- 在配置处添加 @EnableAsync 以启动异步调用功能。如:
@EnableAsync
@Configuration
public class HelloConfiguration {
}
或者
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 在Service中的方法上注解@Async,然后再在Controller中调用该方法,即该方法会异步执行。
@Async
public void innerBegin() {
System.out.println("innerBegin start.");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("innerBegin end.");
}
- 特殊情形1:如果Controller调用的Service方法begin没有@Async,但是方法begin调用了内部的一个@Async方法innerBegin,那么innerBegin也不会异步执行。
public void begin() {
System.out.println("begin start.");
this.innerBegin();
System.out.println("begin end.");
}
@Async
public void innerBegin() {
System.out.println("innerBegin start.");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("innerBegin end.");
}
- 特殊情形2:如果Controller调用的Service方法begin有@Async,方法begin调用了内部的一个@Async方法innerBegin,那么begin会异步执行,而innerBegin不会异步执行,相当于innerBegin的@Async注解这时候没用了。
@Async
public void begin() {
System.out.println("begin start.");
this.innerBegin();
System.out.println("begin end.");
}
@Async
public void innerBegin() {
System.out.println("innerBegin start.");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("innerBegin end.");
}
总结:使用@Async必须要依赖@EnableAsync来启用。外部调用Service的@Async方法可以异步执行,Service调用自己的@Async方法不能异步执行。