| 副标题[/!--empirenews.page--] 通过本文你可以了解到下面这些知识点: 
    Future 模式介绍以及核心思想核心线程数、最大线程数的区别,队列容量代表什么;ThreadPoolTaskExecutor 饱和策略;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声明这个接口口是一个函数式接口。 org.springframework.core.task.TaskExecutor @FunctionalInterface public interface TaskExecutor extends Executor {     void execute(Runnable var1); } 
 
 如果没有自定义Executor, Spring 将创建一个 SimpleAsyncTaskExecutor 并使用它。 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;  import java.util.concurrent.Executor;  /** @author shuang.kou */ @Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer {    private static final int CORE_POOL_SIZE = 6;   private static final int MAX_POOL_SIZE = 10;   private static final int QUEUE_CAPACITY = 100;    @Bean   public Executor taskExecutor() {     // Spring 默认配置是核心线程数大小为1,最大线程容量大小不受限制,队列容量也不受限制。     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();     // 核心线程数     executor.setCorePoolSize(CORE_POOL_SIZE);     // 最大线程数     executor.setMaxPoolSize(MAX_POOL_SIZE);     // 队列大小     executor.setQueueCapacity(QUEUE_CAPACITY);     // 当最大池已满时,此策略保证不会丢失任务请求,但是可能会影响应用程序整体性能。     executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());     executor.setThreadNamePrefix("My ThreadPoolTaskExecutor-");     executor.initialize();     return executor;   } } 
 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |