设为首页 - 加入收藏 邢台站长网 (http://www.0319zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 2018 模式 运营商
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

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

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

  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);?
  5. }?

新手也能看懂的 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. ??}?
  34. }?

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章