spring boot整合线程池

多线程在项目中运用的很多,比如告警消息的发送,需要将告警信息推送到运维人员的微信、邮件、短信等等,电商项目提交订单需要查询商品基础信息、库存、优惠信息、优惠券、用户积分、收货地址、快递信息等等;其中涉及到的流程比较长,如果采用单线程的方式总计耗时将是所有流程的时间的总和;采用多线程的方式最好的状态是最长流程的时间,如果这些流程有依赖关系则可以采用CompletableFuture进行编排;因此对于接口响应时长有要求的业务多线程的运用必不可少。
一般来说一个项目里面有一个线程池就够了,需要用到多线程的地方使用该线程池就行;但不排除有些项目会使用到多个线程池,比如项目核心功能使用一个线程池,告警、对接三方等等周边业务使用一个线程池。最好将线程池的参数配置放在配置文件中比如yaml文件,如果采用了nacos等配置中心组件也可以放在其中,如果项目采用了k8s也可以将配置信息放在ConfigMap中。

先看看线程池七大参数:

int corePoolSize:核心线程数即该线程池不会被销毁的线程数量
int maximumPoolSize:最大线程数即该线程池可同时存在的最大线程数量,该参数不会比corePoolSize小
long keepAliveTime:空闲线程存活时长,当线程池中线程数量大于核心线程数之后,并且存在空闲线程的情况下,当空闲时长超过该时长之后则会被销毁,直到剩余线程数量和corePoolSize数量相等
TimeUnit unit:keepAliveTime的单位
BlockingQueue workQueue:等待队列,当线程池创建之后,接受任务的时候如果线程池中线程数量小于核心线程数则会创建线程来执行该任务,如果大于等于核心线程数之后新提交的任务会进入到workQueue中,等待线程池中的空闲线程从workQueue取出执行任务,如果workQueue满了之后,当线程池中线程数小于maximumPoolSize的情况下则会创建线程来执行该任务,如果线程池中的线程数量等于maximumPoolSize则会执行拒绝策略
ThreadFactory threadFactory:创建线程使用的工厂
RejectedExecutionHandler handler:拒绝策略,当线程池满负荷运转之后新进来的任务的处理方式

spring boot整合线程池_第1张图片
spring boot整合线程池
1、创建线程池配置类
@ConfigurationProperties(“thread.pool”):自动读取配置文件中thread.pool开头的配置信息绑定到对应的字段上,绑定规则是将配置文件中的配置去除掉-转为小驼峰就是对应的类中的字段,如thread.pool.core-pool-size对应字段就是corePoolSize。
@Component:将该类交由spring容器管理
@Data:为字段生成get、set方法

package com.test.springboot.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @version 1.0
 * @Description 线程池配置类
 */
@Component
@Data
@ConfigurationProperties("thread.pool")
public class ThreadPoolConfig {

    private Integer corePoolSize = 3;

    private Integer maximumPoolSize = 6;

    private Integer keepAliveTime = 30;

    private Integer workQueueSize = 10000;

}

2、配置文件中定义配置,当配置文件和配置类都定义了对应属性采用配置文件中的属性值

thread:
  pool:
    core-pool-size: 5
    maximum-pool-size: 10
    keep-alive-time: 60
    work-queue-size: 10000

3、创建线程池

package com.test.springboot.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.*;

/**
 * @version 1.0
 * @Description 线程池工厂
 */
@Configuration
public class ThreadPoolFactory {

    @Autowired
    private ThreadPoolConfig threadPoolConfig;


    @Bean("threadPool")
    public ThreadPoolExecutor createpool(){
        return new ThreadPoolExecutor(threadPoolConfig.getCorePoolSize(),threadPoolConfig.getMaximumPoolSize(),threadPoolConfig.getKeepAliveTime(), TimeUnit.SECONDS,new LinkedBlockingQueue<>(threadPoolConfig.getWorkQueueSize()), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
    }
}

到此,当我们启动spring boot项目的时候会在spring容器中注入一个核心线程数为5、最大线程数10、空闲时间60s、等待队列长度10000、拒绝策略为抛出异常、名称为threadPool的线程池。
在需要用到线程池的类中通过@Resource或@Autowired注入即可使用。

你可能感兴趣的:(springboot,java)