Spring 异步执行之@Async揭秘

背景

在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法。

  1. 何为异步调用?
    在解释异步调用之前,我们先来看同步调用的定义;同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。
    例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕;如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。
  2. 常规的异步调用处理方式
    在Java中,一般在处理类似的场景之时,都是基于创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。

Spring 异步执行Async简介
Spring中用@Async注解标记的方法,称为异步方法,其实就相当于我们自己在当前方法里面:new Thread(()-> System.out.println("hello world !"))。br/>按@Async注解使用的基本方法:
在方法上添加@Async注解;
br/>所使用的@Async注解方法的类对象应该是Spring容器管理的bean对象;
调用异步方法类上需要配置上注解@EnableAsync

Spring 异步执行Async示例

Spring 异步执行之@Async揭秘br/>@EnableAsync相当于AsyncConfigurationSelector,根据@Configuration中的mode来决定产生异步的方式是ProxyAsyncConfiguration还是AspectJAsyncConfiguration,默认的模式是AdviceMode.PROXY。此时注册处理bean:AsyncAnnotationBeanPostProcessor
Spring 异步执行之@Async揭秘
执行程序后控制台输出

calling MyBean#runTask() thread: main
Running task thread: SimpleAsyncTaskExecutor-1
result from task: task result

Spring 异步执行Async之AsyncConfigurer

Spring 异步执行之@Async揭秘

async注解没有指定executor

猜你喜欢

转载自blog.51cto.com/15015181/2556226
今日推荐