浅析注解 @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修饰的方法有返回值(执行时出错)
posted @ 2021-08-14 13:11  超级鲨鱼辣椒  阅读(973)  评论(0编辑  收藏  举报