关于Spring Boot中@Async的讨论

使用方法。

  1. 在配置处添加 @EnableAsync 以启动异步调用功能。如:
@EnableAsync
@Configuration
public class HelloConfiguration {
}

或者

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  1. 在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. 特殊情形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.");
    }

  1. 特殊情形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方法不能异步执行。

你可能感兴趣的:(关于Spring Boot中@Async的讨论)