java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring的@Async失效

Spring中的异步方法@Async失效的原因详解

作者:java架构师-太阳

这篇文章主要介绍了Spring中的异步方法@Async失效的原因详解,@Async属于异步注解,@Async放在方法上标识该方法为异步方法,异步是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,需要的朋友可以参考下

Spring中的异步方法@Async失效的原因

1.没有在配置类中开启@EnableAsync注解,导致异步方法失效。

@Configuration
@EnableAsync // 开启异步支持
public class AppConfig {
    // ...
}

2.异步方法必须要被其它类中的方法调用,如果在同一个类中调用,异步方法仍然是同步执行的。

@Service
public class DemoService {
    @Async
    public void asyncMethod() {
        // ...
    }
    
    public void callAsyncMethod() {
        asyncMethod(); // 异步方法不会被异步执行
    }
}

@Service
public class CallerService {
    @Autowired
    private DemoService demoService;
    
    public void callAsyncMethod() {
        demoService.asyncMethod(); // 异步方法会被异步执行
    }
}

3.异步方法必须要在public方法中被调用,如果被同类中的private方法调用,异步方法仍然是同步执行的。

@Service
public class DemoService {
    @Async
    public void asyncMethod() {
        // ...
    }
    
    public void callAsyncMethod() {
        privateMethod(); // 异步方法不会被异步执行
    }
    
    private void privateMethod() {
        asyncMethod(); // 异步方法不会被异步执行
    }
}

4.异步方法必须是非静态方法,如果是静态方法,异步方法仍然是同步执行的。

@Service
public class DemoService {
    @Async
    public static void asyncMethod() {
        // ...
    }
    
    public void callAsyncMethod() {
        asyncMethod(); // 异步方法不会被异步执行
    }
}

5.异步方法必须要有返回值,如果没有返回值,异步方法仍然是同步执行的。

@Service
public class DemoService {
    @Async
    public void asyncMethod() {
        // ...
    }
    
    @Async
    public Future<String> asyncMethodWithResult() {
        // ...
        return new AsyncResult<>("result");
    }
}

@Service
public class CallerService {
    @Autowired
    private DemoService demoService;
    
    public void callAsyncMethod() {
        demoService.asyncMethod(); // 异步方法不会被异步执行
        Future<String> future = demoService.asyncMethodWithResult(); // 异步方法会被异步执行
    }
}

到此这篇关于Spring中的异步方法@Async失效的原因详解的文章就介绍到这了,更多相关Spring的@Async失效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文