平時需要使用多線程的時候,一般是直接新建一個線程,或者創建一個線程池使用。那么有沒有更便利的方式呢?Spring Boot提供了默認的線程池實現,只需兩個注解即可在項目中使用多線程。
@EnableAsync
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({AsyncConfigurationSelector.class})
public @interface EnableAsync {
Class<? extends Annotation> annotation() default Annotation.class;
boolean proxyTargetClass() default false;
AdviceMode mode() default AdviceMode.PROXY;
int order() default 2147483647;
}
@EnableAsync只能標注在類上,表示開啟異步執行,通常加在啟動類上
@Async
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async {
String value() default "";
}
@Async可以標注在類上、方法上。標注在類上時,此類的所有方法都將異步執行,標注在類上時,只有此方法異步執行。且此注解標注的方法不能有返回值,否則執行時將報錯。
默認使用的線程池是Spring Boot提供的SimpleAsyncTaskExecutor
異步方法並不一定生效,如以下情況下
@Async失效的情況
- 異步方法使用static修飾
- 異步類實例沒有交給Spring管理(即沒有用@Component等注解修飾)
- 異步方法的調用和異步方法在同一個類中
- 沒有使用@EnableAsync注解開啟異步執行
- @Async修飾的方法有返回值(執行時出錯)
