浅析 Spring 中 Async 注解底层异步线程池原理

一、前言

开发中我们经常会用到异步方法调用,具体到代码层面,异步方法调用的实现方式有很多种,比如最原始的通过实现 Runnable 接口或者继承 Thread 类创建异步线程,然后启动异步线程;再如,可以直接用 java.util.concurrent 包提供的线程池相关 API 实现异步方法调用。

如果说可以用一行代码快速实现异步方法调用,那是不是比上面方法香很多。

Spring 提供了 Async 注解,就可以帮助我们一行代码搞定异步方法调用。Async 注解用起来是很爽,但是如果不对其底层实现做深入研究,难免有时候也会心生疑虑,甚至会因使用不当,遇见一些让人摸不着头脑的问题。

本文首先将对 Async 注解做简单介绍,然后和大家分享一个我们项目中因 Async 注解使用不当的线上问题,接着再深扒 Spring 源码,对 Async 注解底层异步线程池的实现原理一探究竟。

二、Async 注解简介

Async 注解定义源码

从源码可以看出 @Async 注解定义很简单,只需要关注两点:

  • Target({ElementType.TYPE, ElementType.METHOD})标志 Async 注解可以作用在方法和类上,作用在类上时,类的所有方法可以实现异步调用。

  • String value( ) default ""是唯一字段属性,用来指定异步线程池,且该字段有缺省值。

Async 注解异步调用实现原理概述

在 Spring 框架中,Async 注解的实现是通过 AOP 来实现的。具体来说,Async 注解是由 AsyncAnnotationAdvisor 这个切面类来实现的。

AsyncAnnotationAdvisor 类是 Spring 框架中用于处理 Async 注解的切面,它会在被 Async 注解标识的方法被调用时,创建一个异步代理对象来执行方法。这个异步代理对象会在一个新的线程中调用被 @Async 注解标识的方法,从而实现方法的异步执行。

在 AsyncAnnotationAdvisor 中,会使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值