spring boot 使用@Async实现异步调用方法
程序员文章站
2024-02-25 23:22:27
使用@async实现异步调用
什么是”异步调用”与”同步调用”
“同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行;”异步调用...
使用@async实现异步调用
什么是”异步调用”与”同步调用”
“同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行;”异步调用”则是只要上一行代码执行,无需等待结果的返回就开始执行本身任务。
通常情况下,”同步调用”执行程序所花费的时间比较多,执行效率比较差。所以,在代码本身不存在依赖关系的话,我们可以考虑通过”异步调用”的方式来并发执行。
“异步调用”
在 spring boot 框架中,只要提过@async注解就能奖普通的同步任务改为异步调用任务。
注意: @async所修饰的函数不要定义为static类型,这样异步调用不会生效
1. 开启@async注解
在spring boot主类添加@enableasync注解
2. 定义异步任务
定义task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内)。
@component public class task { //定义一个随机对象. public static random random =new random(); @async //加入"异步调用"注解 public void dotaskone() throws interruptedexception { system.out.println("开始执行任务一"); long start = system.currenttimemillis(); thread.sleep(random.nextint(10000)); long end = system.currenttimemillis(); system.out.println("完成任务一,耗时:" + (end - start) + "毫秒"); } @async public void dotasktwo() throws interruptedexception { system.out.println("开始执行任务二"); long start = system.currenttimemillis(); thread.sleep(random.nextint(10000)); long end = system.currenttimemillis(); system.out.println("完成任务二,耗时:" + (end - start) + "毫秒"); } @async public void dotaaskthree() throws interruptedexception { system.out.println("开始执行任务三"); long start = system.currenttimemillis(); thread.sleep(random.nextint(10000)); long end = system.currenttimemillis(); system.out.println("完成任务三,耗时:" + (end - start) + "毫秒"); } }
3. 创建controller进行测试
注意@autowired注入类,因为这个类已经被 spring 管理了。如果使用 new 来获得线程类将不会执行异步效果,这里涉及到在 spring 中使用多线程。
@controller public class taskcontroller { @autowired private task task; @responsebody @requestmapping("/task") public string task() throws exception { system.out.println("开始执行controller任务"); long start = system.currenttimemillis(); task.dotaskone(); task.dotasktwo(); task.dotaaskthree(); long end = system.currenttimemillis(); system.out.println("完成controller任务,耗时:" + (end - start) + "毫秒"); return "success"; } }
4. 多次调用
访问 http://localhost:8080/task 截图:
项目参考地址: https://github.com/funrily/springboot-study/tree/master/%e6%a1%88%e4%be%8b7
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
spring boot 使用@Async实现异步调用方法
-
Spring里的Async注解实现异步操作的方法步骤
-
使用Spring Boot和AspectJ实现方法跟踪基础结构
-
vue中使用async、await和promise实现异步API的同步调用
-
使用Spring事件机制实现异步的方法
-
使用Spring事件机制实现异步的方法
-
Spring Boot @Async 异步任务执行方法
-
spring boot使用自定义配置的线程池执行Async异步任务
-
Spring Boot利用@Async如何实现异步调用:自定义线程池
-
Spring Boot利用@Async异步调用:使用Future及定义超时详解