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

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

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

Spring 默认使用的是 ThreadPoolExecutor.AbortPolicy。在Spring的默认情况下,ThreadPoolExecutor 将抛出 RejectedExecutionException 来拒绝新来的任务 ,这代表你将丢失对这个任务的处理。对于可伸缩的应用程序,建议使用 ThreadPoolExecutor.CallerRunsPolicy。当最大池被填满时,此策略为我们提供可伸缩队列。

ThreadPoolTaskExecutor 饱和策略定义:

如果当前同时运行的线程数量达到最大线程数量时,ThreadPoolTaskExecutor 定义一些策略:

ThreadPoolExecutor.AbortPolicy:抛出 RejectedExecutionException来拒绝新任务的处理。

ThreadPoolExecutor.CallerRunsPolicy:调用执行自己的线程运行任务。您不会任务请求。但是这种策略会降低对于新任务提交速度,影响程序的整体性能。另外,这个策略喜欢增加队列容量。如果您的应用程序可以承受此延迟并且你不能任务丢弃任何一个任务请求的话,你可以选择这个策略。

ThreadPoolExecutor.DiscardPolicy: 不处理新任务,直接丢弃掉。

ThreadPoolExecutor.DiscardOldestPolicy:此策略将丢弃最早的未处理的任务请求。

2. 编写一个异步的方法

下面模拟一个查找对应字符开头电影的方法,我们给这个方法加上了@Async注解来告诉 Spring 它是一个异步的方法。另外,这个方法的返回值 CompletableFuture.completedFuture(results)这代表我们需要返回结果,也就是说程序必须把任务执行完成之后再返回给用户。

请留意completableFutureTask方法中的第一行打印日志这句代码,后面分析程序中会用到,很重要!

  1. import org.slf4j.Logger; 
  2. import org.slf4j.LoggerFactory; 
  3. import org.springframework.scheduling.annotation.Async; 
  4. import org.springframework.stereotype.Service; 
  5.  
  6. import java.util.ArrayList; 
  7. import java.util.Arrays; 
  8. import java.util.List; 
  9. import java.util.concurrent.CompletableFuture; 
  10. import java.util.stream.Collectors; 
  11.  
  12. /** @author shuang.kou */ 
  13. @Service 
  14. public class AsyncService { 
  15.  
  16.   private static final Logger logger = LoggerFactory.getLogger(AsyncService.class); 
  17.  
  18.   private List<String> movies = 
  19.       new ArrayList<>( 
  20.           Arrays.asList( 
  21.               "Forrest Gump", 
  22.               "Titanic", 
  23.               "Spirited Away", 
  24.               "The Shawshank Redemption", 
  25.               "Zootopia", 
  26.               "Farewell ", 
  27.               "Joker", 
  28.               "Crawl")); 
  29.  
  30.   /** 示范使用:找到特定字符/字符串开头的电影 */ 
  31.   @Async 
  32.   public CompletableFuture<List<String>> completableFutureTask(String start) { 
  33.     // 打印日志 
  34.     logger.warn(Thread.currentThread().getName() + "start this task!"); 
  35.     // 找到特定字符/字符串开头的电影 
  36.     List<String> results = 
  37.         movies.stream().filter(movie -> movie.startsWith(start)).collect(Collectors.toList()); 
  38.     // 模拟这是一个耗时的任务 
  39.     try { 
  40.       Thread.sleep(1000L); 
  41.     } catch (InterruptedException e) { 
  42.       e.printStackTrace(); 
  43.     } 
  44.     //返回一个已经用给定值完成的新的CompletableFuture。 
  45.     return CompletableFuture.completedFuture(results); 
  46.   } 

(编辑:宁德站长网)

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