当前位置:   article > 正文

SpringBoot中使用Spring自带线程池ThreadPoolTaskExecutor与Java8CompletableFuture实现异步任务示例

SpringBoot中使用Spring自带线程池ThreadPoolTaskExecutor与Java8CompletableFuture实现异步任务示例

场景

关于线程池的使用:

Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):

Java中ExecutorService线程池的使用(Runnable和Callable多线程实现)_executorservice executorservice = executors.newfix-CSDN博客

Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例:

Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例_threadpoolexecutor创建线程-CSDN博客

项目开发中多使用SpringBoot,Spring中有个自带的线程池ThreadPoolTaskExecutor

Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程,使用ThreadPoolTaskExecutor实现一个基于线程池的TaskExecutor

ThreadPoolTaskExecutor是spring core包中的,而ThreadPoolExecutor是JDK中的JUC。

ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。

ThreadPoolTaskExecutor这个类则是spring包下的,是spring为我们提供的线程池类。

SpringBoot默认情况下帮我们自动配置了ThreadPoolTaskExecutor到IOC容器中,我们需要的时候直接注入使用即可。

如果我们不想要SpringBoot帮我们默认配置的线程池参数,我们可以自行配置,ThreadPoolTaskExecutor支持对线程池核心参数的重新配置。

注:

博客:
霸道流氓气质-CSDN博客

实现

1、以若依项目为例

若依前后端分离版手把手教你本地搭建环境并运行项目:

若依前后端分离版手把手教你本地搭建环境并运行项目_本地运行若依前后端分离-CSDN博客

ruoyi中对Spring默认的线程池参数进行配置,配置文件位置

配置文件内容

  1. package com.ruoyi.framework.config;
  2. import java.util.concurrent.ScheduledExecutorService;
  3. import java.util.concurrent.ScheduledThreadPoolExecutor;
  4. import java.util.concurrent.ThreadPoolExecutor;
  5. import org.apache.commons.lang3.concurrent.BasicThreadFactory;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  9. import com.ruoyi.common.utils.Threads;
  10. /**
  11.  * 线程池配置
  12.  *
  13.  * @author ruoyi
  14.  **/
  15. @Configuration
  16. public class ThreadPoolConfig
  17. {
  18.     // 核心线程池大小
  19.     private int corePoolSize = 50;
  20.     // 最大可创建的线程数
  21.     private int maxPoolSize = 200;
  22.     // 队列最大长度
  23.     private int queueCapacity = 1000;
  24.     // 线程池维护线程所允许的空闲时间
  25.     private int keepAliveSeconds = 300;
  26.     @Bean(name = "threadPoolTaskExecutor")
  27.     public ThreadPoolTaskExecutor threadPoolTaskExecutor()
  28.     {
  29.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  30.         executor.setMaxPoolSize(maxPoolSize);
  31.         executor.setCorePoolSize(corePoolSize);
  32.         executor.setQueueCapacity(queueCapacity);
  33.         executor.setKeepAliveSeconds(keepAliveSeconds);
  34.         // 线程池对拒绝任务(无线程可用)的处理策略
  35.         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
  36.         return executor;
  37.     }
  38. }

2、Java中使用CompletableFuture实现异步任务

Java8中CompletableFuture实现异步任务编排以及示例:

Java8中CompletableFuture实现异步任务编排以及示例_java并发 completablefuture异步编程的实现-CSDN博客

3、在需要使用线程池的地方直接注入

  1.     @Autowired
  2.     private ThreadPoolTaskExecutor threadPoolTaskExecutor;

4、线程池的使用

编写单元测试并统计耗时

  1.     @Test
  2.     public void test2() {
  3.         StopWatch stopWatch = new StopWatch();
  4.         stopWatch.start();
  5.         for (int i = 0; i < 5; i++) {
  6.             int finalI = i;
  7.            CompletableFuture.runAsync(() -> {
  8.                 System.out.println(finalI + "执行异步操作。。。");
  9.                 int result = 0;
  10.                 for (int j = 0; j < 1000000; j++) {
  11.                     result += j;
  12.                 }
  13.                System.out.println("计算结果:"+result);
  14.             }, threadPoolTaskExecutor);
  15.         }
  16.         stopWatch.stop();
  17.         System.out.println("总耗时"+stopWatch.getLastTaskTimeMillis());
  18.     }

运行结果

为形成对比,编写以下测试

  1.     @Test
  2.     public void test1() {
  3.         StopWatch stopWatch = new StopWatch();
  4.         stopWatch.start();
  5.         for (int i = 0; i < 5; i++) {
  6.             int result = 0;
  7.             for (int j = 0; j < 1000000; j++) {
  8.                 result += j;
  9.             }
  10.             System.out.println("计算结果:"+result);
  11.         }
  12.         stopWatch.stop();
  13.         System.out.println("总耗时"+stopWatch.getLastTaskTimeMillis());
  14.     }

运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/63826
推荐阅读
相关标签
  

闽ICP备14008679号