加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

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

发布时间:2019-10-11 06:49:00 所属栏目:建站 来源:SnailClimb
导读:通过本文你可以相识到下面这些常识点: 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.   } 

(编辑:湖南网)

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

热点阅读