@Async的用法和示例

@Async 注解的用法和示例背景异步调用@Async介绍在Spring中启用@Async示例一:基本使用方式示例二:在同一个类中调用异步方法示例三:异步方法是static方法示例四:在方法级别上修改默认的执行器
背景
通常,在Java中的方法调用都是同步调用,比如在A方法中调用了B方法,则在A调用B方法之后,必须等待B方法执行并返回后,AB方法执行时间较长,则可能会导致调用A的请求响应迟缓,为了解决这种问题,可以使用Spirng的注解@Async来用异步调用的方式处理,当然也会有别的多线程方式解决此类问题,本文主要分析@Async在解决此类问题时的用法以及具体的示例。
异步调用
比如方法A调用方法B,如果B是一个异步方法,则A方法在调用B方法之后,不用等待B方法执行完成,而是直接往下继续执行别的代码。
@Async介绍
在Spring中,使用@Async标注某方法,可以使该方法变成异步方法,这些方法在被调用的时候,将会在独立的线程中进行执行,调用者不需等待该方法执行完成。
在Spring中启用@Async
使用@EnableAsync
示例一:基本使用方式
在方法上添加@Async注解
调用异步方法
执行结果

从执行结果可以看出,main线程中的func1方法在调用异步方法test2后,没有等待test2方法执行完成,直接执行后面的代码。
示例二:在同一个类中调用异步方法
方法func2和上面的异步方法test2方法在同一个类中

从执行结果可知,main线程中的func2方法在调用异步方法test2方法后,等待test2方法执行完后,才继续往后执行。
示例三:异步方法是static方法
异步方法test3是一个static方法
调用test3的方法
执行结果。可以看出在static方法上添加@Async注解,当调用该方法时并没有新启用一个线程单独执行,而是按顺序执行代码,说明异步无效。

示例四:在方法级别上修改默认的执行器
自定义一个线程池执行器代替默认的执行器
自定义的线程池执行器
异步方法上使用自定义的执行器
调用test4异步方法
从执行结果可以看出,@Async注解声明使用指定的自定义的异步执行器,已经替换了默认的执行器。而且调用异步方法的main线程没有等待异步方法的执行。
说明:新建自定义的执行器后,注解@Async默认就会替换成自定义的执行器,所以在@Async注解上可以不用指定。

1.01^{365} ≈ 37.7834343329 0.99^{365} ≈ 0.02551796445 相信坚持的力量!