<强>春天中@Async用法强>
引言:在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法。
<强> 1只;何为异步调用? 强>
,,,在解释异步调用之前,我们先来看同步调用的定义;同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。
,,,,例如,在某个调用中,需要顺序调用A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕,如B为一个异步的调用方法,则在执行完一个之后,调用B,并不等待B完成,而是执行开始调用C, C待执行完毕之后,就意味着这个过程执行完毕了。
<强> 2只;常规的异步调用处理方式强>
,,,在Java中,一般在处理类似的场景之时,都是基于创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。
<强> 3。@Async介绍强>
,,在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。
,,,,如何在春天中启用@Async
,,,,,,基于Java配置的启用方式:
@ configuration @EnableAsync 公开课SpringAsyncConfig {…} >之前,,,,基于XML配置文件的启用方式,配置如下:
& lt;任务:执行程序id=" myexecutor "池大?" 5 "/比; & lt;任务:注解驱动的遗嘱执行人=" myexecutor "/比; >之前,,以上就是两种定义的方式。
4。基于@Async无返回值调用
,,,示例如下:
@Async//标注使用 公共空间asyncMethodWithVoidReturnType () { 系统。println(“异步执行方法。” + Thread.currentThread () . getname ()); } >之前,使用的方式非常简单,一个标注即可解决所有的问题。
<强> 5。基于@Async返回值的调用强>
,,示例如下:
@Async 公共FutureasyncMethodWithReturnType () { 系统。println(“异步执行方法——“ + Thread.currentThread () . getname ()); 尝试{ thread . sleep (5000); 返回新AsyncResult (“hello world !”); }捕捉(InterruptedException e) {//} 返回null; } >之前 ,,以上示例可以发现,返回的数据类型为未来类型,其为一个接口。具体的结果类型为AsyncResult,这个是需要注意的地方。
,,调用返回结果的异步方法示例:
公共空间testAsyncAnnotationForMethodsWithReturnType () 抛出InterruptedException, ExecutionException { 系统。println(“调用异步方法。” + Thread.currentThread () . getname ()); Future未来=asyncAnnotationExample.asyncMethodWithReturnType (); 而(真){///这里使用了循环判断,等待获取结果信息 如果(future.isDone()){//判断是否执行完毕 系统。println(“从异步过程——结果”+ future.get ()); 打破; } 系统。println(“继续做其他的事情。”); thread . sleep (1000); } } >之前 ,分析:这些获取异步方法的结果信息,是通过不停的检查未来的状态来获取当前的异步方法是否执行完毕来实现的。
<强> 6。基于@Async调用中的异常处理机制强>
,,,在异步方法中,如果出现异常,对于调用者调用者而言,是无法感知的。如果确实需要进行异常处理,则按照如下方法来进行处理:
,,,1只;自定义实现AsyncTaskExecutor的任务执行器
,,,,,,,,在这里定义处理具体异常的逻辑和方式。
,,,2只;配置由自定义的TaskExecutor替代内置的任务执行器
,,,示例步骤1,自定义的TaskExecutor
春天中@Async用法详解及简单实例