@Async注解异步线程不生效解决方案(二)

导读:本篇文章讲解 @Async注解异步线程不生效解决方案(二),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

问题背景

在做项目时,发现我开启的异步方法,返回一直很慢,才发现异步注解@Async并没有生效

@Async注解测试用例附源码(一)

@Async注解异步线程不生效解决方案(二)

代码示例

1 开启的异步方法错误示例

@Component
@Slf4j
public class Method {

	public void test(){
		asyncMethod();
	}

    @Async
    public Future<Integer> asyncMethod() throws InterruptedException {
        log.info("AsyncMethod thread: {}", Thread.currentThread().getName());
        // 异步线程延时 5s 返回结果
        Thread.sleep(5000);
        return new AsyncResult<>(2);
    }
}

2 被调用方法asyncMethod和调用处的方法test属于同一个类,只是相当于本类调用,并没有使用代理类 ,从而@Async注解失效了,更改方案

@Component
@Slf4j
public class Call{

	@Autowired
    Method method;
    
	public void test(){
		method.asyncMethod();
	}
}

3 在其他类里面使用远程调用,@Async注解生效

总结

  • @Async需要在不同类使用才会产生异步效果,方法一定要从另一个类中调用,也就是从类的外部调用,类的内部调用是无效的
  • 没有走Spring的代理类。因为@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器管理
  • @SpringBootApplication启动类当中没有添加@EnableAsync注解
  • 异步方法使用注解@Async的返回值只能为void或者Future
  • 注解的方法必须是public方法。
  • 如果需要从类的内部调用,需要先获取其代理类

作为程序员第 36 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha …
@Async注解异步线程不生效解决方案(二)@Async注解异步线程不生效解决方案(二)@Async注解异步线程不生效解决方案(二)

Lyric:载你缓缓的离开

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/110840.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!