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

 更新时间:2024年01月13日 09:10:24   作者: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失效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot项目快速实现拦截器功能

    Springboot项目快速实现拦截器功能

    上一篇文章介绍了Springboot项目如何快速实现过滤器功能,本篇文章接着来盘一盘拦截器,仔细研究后会发现,其实拦截器和过滤器的功能非常类似,可以理解为面向切面编程的一种具体实现。感兴趣的小伙伴可以参考阅读
    2023-03-03
  • java通过HTTP接收json详细实例代码

    java通过HTTP接收json详细实例代码

    Java作为一门广泛使用的编程语言,很多开发人员会用它来进行http请求,获取json数据,这篇文章主要给大家介绍了关于java通过HTTP接收json的相关资料,需要的朋友可以参考下
    2023-11-11
  • Spring MVC的优点与核心接口_动力节点Java学院整理

    Spring MVC的优点与核心接口_动力节点Java学院整理

    这篇文章主要介绍了Spring MVC的优点与核心接口,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • MyBatis代理Dao方式的增删改查的实现小结

    MyBatis代理Dao方式的增删改查的实现小结

    本文主要介绍了MyBatis代理Dao方式的增删改查的实现小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • java实现固定时段倒计时的示例代码

    java实现固定时段倒计时的示例代码

    这篇文章主要为大家详细介绍了java实现固定时段倒计时,可以在每隔一定时间给出时间倒计时提示,文中的示例代码讲解详细,需要的可以了解下
    2025-08-08
  • Java中关于String的两种赋值方式

    Java中关于String的两种赋值方式

    这篇文章主要介绍了Java中关于String的两种赋值方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java SPI机制及Springboot的使用实例代码

    Java SPI机制及Springboot的使用实例代码

    这篇文章主要介绍了Java SPI机制及Springboot的使用实例代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Java生成MD5加密字符串代码实例

    Java生成MD5加密字符串代码实例

    这篇文章主要介绍了Java生成MD5加密字符串代码实例,本文对MD5的作用作了一些介绍,然后给出了Java下生成MD5加密字符串的代码示例,需要的朋友可以参考下
    2015-06-06
  • Java socket通讯实现过程及问题解决

    Java socket通讯实现过程及问题解决

    这篇文章主要介绍了Java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 详解Java面向对象编程中方法的使用

    详解Java面向对象编程中方法的使用

    这篇文章主要介绍了详解Java面向对象编程中方法的使用,包括方法的重载和参数以及泛型方法等知识点,需要的朋友可以参考下
    2016-02-02

最新评论