介绍一下springboot线程池的相关配置以及相关知识:
配置文件
首先我们配置一个配置文件application-task.yml,使用springboot本身提供的参数配置
spring:
task:
execution:
pool:
core-size: 11
max-size: 100
keep-alive: 60s
queue-capacity: 1000
allow-core-thread-timeout: true
线程池处理流程
提交一个任务到线程池中,线程池的处理流程如下:
- 判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创 建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。
- 线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如 果工作队列满了,则进入下个流程。
- 判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已 经满了,则交给饱和策略来处理这个任务。
线程池配置类
会默认使用我们的线程池配置
@Configuration
public class ThreadConfig {
@Bean(name = "getDataHandleExecutor")
ThreadPoolTaskExecutor getDataHandleExecutor(TaskExecutorBuilder builder) {
ThreadPoolTaskExecutor taskExecutor = builder.build();
taskExecutor.setThreadNamePrefix("interface-handle-thread-");
return taskExecutor;
}
}
线程池参数说明:
- corePoolSize:线程池的核心线程数。在没有设置 allowCoreThreadTimeOut 为 true 的情况下,核心线程会在线程池中一直存活,即使处于闲置状态。
- maximumPoolSize:线程池所能容纳的最大线程数。当活动线程(核心线程+非核心线程)达到这个数值后,后续任务将会根据 RejectedExecutionHandler 来进行拒绝策略处理。
- keepAliveTime:非核心线程 闲置时的超时时长。超过该时长,非核心线程就会被回收。若线程池通设置核心线程也允许 timeOut,即 allowCoreThreadTimeOut 为 true,则该时长同样会作用于核心线程,在超过aliveTime 时,核心线程也会被回收,AsyncTask 配置的线程池就是这样设置的。
- unit:keepAliveTime 时长对应的单位。
- workQueue:线程池中的任务队列,通过线程池的 execute() 方法提交的 Runnable 对象会存储在该队列中。
- ThreadFactory:线程工厂,功能很简单,就是为线程池提供创建新线程的功能。这是一个接口,可以通过自定义,做一些自定义线程名的操作。
- RejectedExecutionHandler:当任务无法被执行时(超过线程最大容量 maximum 并且 workQueue 已经被排满了)的处理策略,
- 这里有四种任务拒绝类型。
使用
1、使用@Async注解
2、 注入
@Resource(name = "getDataHandleExecutor")
private ThreadPoolTaskExecutor executor;
3、使用
executor.execute(() -> {
//业务逻辑
}
版权归原作者 ricardo.M.Yu 所有, 如有侵权,请联系我们删除。