淺析注解 @EnableAsync @Async


平時需要使用多線程的時候,一般是直接新建一個線程,或者創建一個線程池使用。那么有沒有更便利的方式呢?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修飾的方法有返回值(執行時出錯)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM