副问题[/!--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;
- }
- }
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|