加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

新手也能看懂的 SpringBoot 异步编程指南

发布时间:2019-10-15 15:11:48 所属栏目:优化 来源:SnailClimb
导读:副标题#e# 通过本文你可以了解到下面这些知识点: Future 模式介绍以及核心思想 核心线程数、最大线程数的区别,队列容量代表什么; ThreadPoolTaskExecutor 饱和策略; SpringBoot 异步编程实战,搞懂代码的执行逻辑。 Future 模式 异步编程在处理耗时操作以

另外,从上面的运行结果可以看出,当所有任务执行完成之后才返回结果。这种情况对应于我们需要返回结果给客户端请求的情况下,假如我们不需要返回任务执行结果给客户端的话呢? 就比如我们上传一个大文件到系统,上传之后只要大文件格式符合要求我们就上传成功。普通情况下我们需要等待文件上传完毕再返回给用户消息,但是这样会很慢。采用异步的话,当用户上传之后就立马返回给用户消息,然后系统再默默去处理上传任务。这样也会增加一点麻烦,因为文件可能会上传失败,所以系统也需要一点机制来补偿这个问题,比如当上传遇到问题的时候,发消息通知用户。

下面会演示一下客户端不需要返回结果的情况:

将completableFutureTask方法变为 void 类型

  1. @Async 
  2. public void completableFutureTask(String start) { 
  3.   ...... 
  4.   //这里可能是系统对任务执行结果的处理,比如存入到数据库等等...... 
  5.   //doSomeThingWithResults(results); 

Controller 代码修改如下:

  1. @GetMapping("/movies") 
  2.  public String completableFutureTask() throws ExecutionException, InterruptedException { 
  3.    // Start the clock 
  4.    long start = System.currentTimeMillis(); 
  5.    // Kick of multiple, asynchronous lookups 
  6.    List<String> words = Arrays.asList("F", "T", "S", "Z", "J", "C"); 
  7.        words.stream() 
  8.            .forEach(word -> asyncService.completableFutureTask(word)); 
  9.    // Wait until they are all done 
  10.    // Print results, including elapsed time 
  11.    System.out.println("Elapsed time: " + (System.currentTimeMillis() - start)); 
  12.    return "Done"; 
  13.  } 

请求这个接口,控制台打印出下面的内容:

  1. Elapsed time: 0 
  2. 2019-10-01 14:02:44.052  WARN 19051 --- [lTaskExecutor-4] g.j.a.service.AsyncService               : My ThreadPoolTaskExecutor-4start this task! 
  3. 2019-10-01 14:02:44.052  WARN 19051 --- [lTaskExecutor-3] g.j.a.service.AsyncService               : My ThreadPoolTaskExecutor-3start this task! 
  4. 2019-10-01 14:02:44.052  WARN 19051 --- [lTaskExecutor-2] g.j.a.service.AsyncService               : My ThreadPoolTaskExecutor-2start this task! 
  5. 2019-10-01 14:02:44.052  WARN 19051 --- [lTaskExecutor-1] g.j.a.service.AsyncService               : My ThreadPoolTaskExecutor-1start this task! 
  6. 2019-10-01 14:02:44.052  WARN 19051 --- [lTaskExecutor-6] g.j.a.service.AsyncService               : My ThreadPoolTaskExecutor-6start this task! 
  7. 2019-10-01 14:02:44.052  WARN 19051 --- [lTaskExecutor-5] g.j.a.service.AsyncService               : My ThreadPoolTaskExecutor-5start this task! 

可以看到系统会直接返回给用户结果,然后系统才真正开始执行任务。

待办

  • Future vs. CompletableFuture
  • 源代码分析

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!