SpringBoot关于线程池的配置

一、代码部分

AsyncConfig

import com.tmzh.saas.topic.properties.ThreadPoolProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@EnableAsync
@Configuration
public class AsyncConfig {


    @Bean(name = "myTaskExecutor")
    public Executor tmyTaskExecutor(ThreadPoolProperties threadPoolProperties) {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心线程数量,线程池创建时候初始化的线程数
        executor.setCorePoolSize(threadPoolProperties.getCorePoolSize());
        //最大线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        executor.setMaxPoolSize(threadPoolProperties.getMaxPoolSize());
        //缓冲队列,用来缓冲执行任务的队列
        executor.setQueueCapacity(threadPoolProperties.getQueueCapacity());
        //当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveTime());
        //设置好了之后可以方便我们定位处理任务所在的线程池
        executor.setThreadNamePrefix(threadPoolProperties.getThreadNamePrefix());
        //用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //该方法用来设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
        executor.setAwaitTerminationSeconds(60);
        //线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 初始化
        // 通过spring @Bean方式注入ThreadPoolTaskExecutor实例时,可以不需要这一步。
        // 由于ThreadPoolTaskExecutor继承了ExecutorConfigurationSupport,初始化对象时会调用ExecutorConfigurationSupport.afterPropertiesSet()
        executor.initialize();
        return executor;
    }

}

ThreadPoolProperties

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
@ConfigurationProperties(prefix = "thread.pool")
public class ThreadPoolProperties {
    /**
     * 核心线程数(默认线程数)
     */
    private int corePoolSize = Runtime.getRuntime().availableProcessors();
    /**
     * 最大线程数
     */
    private int maxPoolSize = Runtime.getRuntime().availableProcessors();
    /**
     * 允许线程空闲时间(单位:默认为秒)
     */
    private int keepAliveTime = 60;
    /**
     * 缓冲队列大小
     */
    private int queueCapacity = 200;
    /**
     * 线程池名前缀
     */
    private String threadNamePrefix = "asyncTask-";

}

application.yml

thread:
  pool:
    core-pool-size: 8
    max-pool-size: 16
    keep-alive-time: 60
    queue-capacity: 1000
    thread-name-prefix: myAsyncTask-

META-INF/additional-spring-configuration-metadata.json

{
  "properties": [
    {
      "name": "thread.pool.core-pool-size",
      "type": "java.lang.Integer",
      "description": "核心线程数"
    },
    {
      "name": "thread.pool.max-pool-size",
      "type": "java.lang.Integer",
      "description": "最大线程数"
    },
    {
      "name": "thread.pool.keep-alive-time",
      "type": "java.lang.Integer",
      "description": "允许线程空闲时间(单位:默认为秒)"
    },
    {
      "name": "thread.pool.queue-capacity",
      "type": "java.lang.Integer",
      "description": "缓冲队列大小"
    },
    {
      "name": "thread.pool.thread-name-prefix",
      "type": "java.lang.String",
      "description": "线程池名前缀"
    }
  ]
}

二、如何确定线程池大小?

Ncpu 表示 核心数。

如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 Ncpu+1

如果是IO密集型任务,参考值可以设置为 2 * Ncpu

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Springboot中,配置线程池主要有两种方式:配置默认线程池和提供自定义线程池。从使用角度来看,两种配置方式并无优劣之分。如果使用默认线程池,可以直接使用@Async注解来将方法提交到默认线程池中执行。如果需要使用自定义线程池,需要在配置文件中进行相关配置,并通过@Async("自定义线程池bean对象名")的方式来使用该线程池。例如,在配置文件application-task.yml中,可以使用spring.task.execution.pool.*的参数来配置自定义线程池的属性,如core-size、max-size、keep-alive、queue-capacity等。具体的线程池处理流程如下:首先判断线程池中的核心线程是否都在执行任务,如果有空闲的核心线程或者还有未创建的核心线程,则创建一个新的工作线程来执行任务;如果所有核心线程都在执行任务,则判断工作队列是否已满,如果工作队列未满,则将新提交的任务存储在工作队列中;如果工作队列已满,则判断线程池中的线程是否都处于工作状态,如果有空闲的线程,则创建一个新的工作线程来执行任务;如果已经没有空闲的线程,则根据饱和策略来处理该任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Springboot应用中线程池配置教程(2021版)](https://blog.csdn.net/yu102655/article/details/114846051)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Springboot线程池配置](https://blog.csdn.net/yu619251940/article/details/127862318)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原来是小雨啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值