首页 > 编程语言 >SpringBoot中使用Spring自带线程池ThreadPoolTaskExecutor与Java8CompletableFuture实现异步任务示例

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

时间:2024-02-05 10:12:14浏览次数:33  
标签:SpringBoot 示例 int Spring 线程 executor stopWatch import ThreadPoolTaskExecutor

场景

关于线程池的使用:

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

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904

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

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130068794

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

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

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

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

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

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

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

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、以若依项目为例

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

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662

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

 

配置文件内容

package com.ruoyi.framework.config;

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import com.ruoyi.common.utils.Threads;

/**
 * 线程池配置
 *
 * @author ruoyi
 **/
@Configuration
public class ThreadPoolConfig
{
    // 核心线程池大小
    private int corePoolSize = 50;

    // 最大可创建的线程数
    private int maxPoolSize = 200;

    // 队列最大长度
    private int queueCapacity = 1000;

    // 线程池维护线程所允许的空闲时间
    private int keepAliveSeconds = 300;

    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor()
    {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        executor.setCorePoolSize(corePoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        // 线程池对拒绝任务(无线程可用)的处理策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
}

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

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

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/128529900

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

    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;

4、线程池的使用

编写单元测试并统计耗时

    @Test
    public void test2() {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        for (int i = 0; i < 5; i++) {
            int finalI = i;
           CompletableFuture.runAsync(() -> {
                System.out.println(finalI + "执行异步操作。。。");
                int result = 0;
                for (int j = 0; j < 1000000; j++) {
                    result += j;
                }
               System.out.println("计算结果:"+result);
            }, threadPoolTaskExecutor);
        }
        stopWatch.stop();
        System.out.println("总耗时"+stopWatch.getLastTaskTimeMillis());
    }

运行结果

 

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

    @Test
    public void test1() {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        for (int i = 0; i < 5; i++) {
            int result = 0;
            for (int j = 0; j < 1000000; j++) {
                result += j;
            }
            System.out.println("计算结果:"+result);
        }
        stopWatch.stop();
        System.out.println("总耗时"+stopWatch.getLastTaskTimeMillis());
    }

运行结果

 

标签:SpringBoot,示例,int,Spring,线程,executor,stopWatch,import,ThreadPoolTaskExecutor
From: https://www.cnblogs.com/badaoliumangqizhi/p/18007457

相关文章

  • SpringCloud工程添加openfeign使用服务之间调用
    SpringCloud服务之间的调用可以采用openfeign,今天这里就简单记录下需要做的步骤。前置条件就是微服务都建好了,并且两个服务都注册到nacos上,这里用两个微服务模块。简单描述:请求A模块,然后去调用B模块数据,最后从A模块接口返回。需要在A模块添加openfeign的依赖和service写好接口,B......
  • 阿里二面:SpringBoot可以同时处理多少个请求?当场懵了。。。。
    SpringBoot以其简洁高效的开发方式和强大的内嵌容器特性,为开发者提供了构建高性能后端服务的便利。然而,当面临高并发场景时,理解并合理配置SpringBoot应用以达到最佳的并发处理能力至关重要。在SpringBoot中,应用程序对HTTP请求的并发处理主要依赖于内嵌的Servlet容器(如Tomcat)。接......
  • spring-plugin简单使用
    spring-plugin是spring官方提供的一个插件化设计方案,比如使用支持基于spring的项目项目结构此简单测试项目是一个maven多模块的,包含了一个plugin契约模块,连个插件实现,以及一个bootstrap启动入口代码结构├──README.md├──bootstrap│├──H......
  • SpringBoot实现统一异常处理
    目录前言实现步骤定义统一响应对象类定义业务异常枚举接口和实现定义业务异常基类定义全局异常处理切面测试和验证总结前言近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功......
  • 全网最全:SpringBoot 各种回滚骚操作实战
    事务定义事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交......
  • 四、SpringCloud alibaba 之 OpenFeign
    4.1、调用过程的演化JAVA项目中如何实现接口调用?远程调用工具描述HttpClientHttpClient是ApacheJakartaCommon下的子项目,用来提供高效的、最新的、功能丰富的支持Http协议的客户端编程工具包,并且它支持HTTP协议最新版本和建议。HttpClient相比传统JDK自......
  • spring cloud与加密库jasypt(ulisesbocchio)冲突问题定位
    背景最近在项目上遇到个问题。项目就是普通的springcloud,springcloud在springboot的基础上多了一些东西,比如支持bootstrap上下文(通过bootstrap.yml/properties配置)。另外呢,我们这边要求上线的时候,要把配置文件里的敏感配置如密码,进行加密。加密的话,我们这边用了如下库:<depend......
  • Java SPI 代码示例
    JavaServiceProviderInterface是JDK自带的服务提供者接口又叫服务发现机制更是一种面向接口的设计思想。即JDK本身提供接口类,第三方实现其接口,并作为jar包或其他方式注入到其中,在运行时会被JDKServiceLoader发现并加载,自动调用实现类的方法。1.在本地测试SPI机制本人......
  • 开发小技巧 - springboot项目启动控制台输出访问地址
    在SpringBoot项目中,有时我们需要记录或输出访问的地址和IP,以便进行调试、监控或日志记录。以下是如何在SpringBoot中实现这一需求的方法: 1、编写获取所有访问地址工具类packagecom.example.utils;importcn.hutool.core.util.StrUtil;importorg.springframework.b......
  • SpringBoot连接MySQL
    一、文件结构: 二、实体类packagecom.example.demo.domain;importjava.io.Serializable;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.Table;......