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

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

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

通过本文你可以了解到下面这些知识点:

  1. Future 模式介绍以及核心思想
  2. 核心线程数、最大线程数的区别,队列容量代表什么;
  3. ThreadPoolTaskExecutor 饱和策略;
  4. SpringBoot 异步编程实战,搞懂代码的执行逻辑。
  5. 新手也能看懂的 SpringBoot 异步编程指南

Future 模式

异步编程在处理耗时操作以及多任务处理的场景下非常有用,我们可以更好的让我们的系统利用好机器的 CPU 和 内存,提高它们的利用率。多线程设计模式有很多种,Future模式是多线程开发中非常常见的一种设计模式,本文也是基于这种模式来说明 SpringBoot 对于异步编程的知识。

实战之前我先简单介绍一下 Future 模式的核心思想 吧!。

Future 模式的核心思想是 异步调用 。当我们执行一个方法时,假如这个方法中有多个耗时的任务需要同时去做,而且又不着急等待这个结果时可以让客户端立即返回然后,后台慢慢去计算任务。当然你也可以选择等这些任务都执行完了,再返回给客户端。这个在 Java 中都有很好的支持,我在后面的示例程序中会详细对比这两种方式的区别。

SpringBoot 异步编程实战

如果我们需要在 SpringBoot 实现异步编程的话,通过 Spring 提供的两个注解会让这件事情变的非常简单。

  • @EnableAsync:通过在配置类或者Main类上加@EnableAsync开启对异步方法的支持。
  • @Async 可以作用在类上或者方法上,作用在类上代表这个类的所有方法都是异步方法。

1. 自定义 TaskExecutor

很多人对于 TaskExecutor 不是太了解,所以我们花一点篇幅先介绍一下这个东西。从名字就能看出它是任务的执行者,它领导执行着线程来处理任务,就像司令官一样,而我们的线程就好比一只只军队一样,这些军队可以异步对敌人进行打击👊。

Spring 提供了TaskExecutor接口作为任务执行者的抽象,它和java.util.concurrent包下的Executor接口很像。稍微不同的 TaskExecutor接口用到了 Java 8 的语法@FunctionalInterface声明这个接口口是一个函数式接口。

  1. org.springframework.core.task.TaskExecutor 
  2. @FunctionalInterface 
  3. public interface TaskExecutor extends Executor { 
  4.     void execute(Runnable var1); 

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

如果没有自定义Executor, Spring 将创建一个 SimpleAsyncTaskExecutor 并使用它。

  1. import org.springframework.context.annotation.Bean; 
  2. import org.springframework.context.annotation.Configuration; 
  3. import org.springframework.scheduling.annotation.AsyncConfigurer; 
  4. import org.springframework.scheduling.annotation.EnableAsync; 
  5. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; 
  6.  
  7. import java.util.concurrent.Executor; 
  8.  
  9. /** @author shuang.kou */ 
  10. @Configuration 
  11. @EnableAsync 
  12. public class AsyncConfig implements AsyncConfigurer { 
  13.  
  14.   private static final int CORE_POOL_SIZE = 6; 
  15.   private static final int MAX_POOL_SIZE = 10; 
  16.   private static final int QUEUE_CAPACITY = 100; 
  17.  
  18.   @Bean 
  19.   public Executor taskExecutor() { 
  20.     // Spring 默认配置是核心线程数大小为1,最大线程容量大小不受限制,队列容量也不受限制。 
  21.     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
  22.     // 核心线程数 
  23.     executor.setCorePoolSize(CORE_POOL_SIZE); 
  24.     // 最大线程数 
  25.     executor.setMaxPoolSize(MAX_POOL_SIZE); 
  26.     // 队列大小 
  27.     executor.setQueueCapacity(QUEUE_CAPACITY); 
  28.     // 当最大池已满时,此策略保证不会丢失任务请求,但是可能会影响应用程序整体性能。 
  29.     executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 
  30.     executor.setThreadNamePrefix("My ThreadPoolTaskExecutor-"); 
  31.     executor.initialize(); 
  32.     return executor; 
  33.   } 

(编辑:宁德站长网)

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