什么是异步调用?html
异步调用是相对于同步调用而言的,同步调用是指程序按预约顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完便可执行。java
如何实现异步调用?web
多线程,这是不少人第一眼想到的关键词,没错,多线程就是一种实现异步调用的方式。spring
在非spring目项目中咱们要实现异步调用的就是使用多线程方式,能够本身实现Runable接口或者集成Thread类,或者使用jdk1.5以上提供了的Executors线程池。浏览器
StrngBoot中则提供了很方便的方式执行异步调用。多线程
按照官方示例开撸app
代码入下异步
maven依赖:async
启动类:添加@EnableAsync注解
Controller maven
只需在须要异步执行方法上添加@Async注解
main函数运行spirngboot项目,启动完成后浏览器访问:
http://localhost:8080/
控制台:
等了一段浏览器时候输出入下:
异步并无执行!
难道是代码写错了?反复检查了好几遍,并无发现什么明显错误,想起spring对@Transactional注解时也有相似问题,spring扫描时具备@Transactional注解方法的类时,是生成一个代理类,由代理类去开启关闭事务,而在同一个类中,方法调用是在类体内执行的,spring没法截获这个方法调用。
豁然开朗,将异步任务单独放到一个类中,调整代码入下:
Controller
异步任务类
控制台:
异步调用成功!
如何知道三个异步任务何时执行完,执行的结果怎样呢?能够采用添加Fature回调方式判断
代码入下:
异步任务类
控制台输出:
浏览器输出:
异步调用成功,而且在全部任务都完成时程序才返回告终果!