浅析注解 @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