线程池实践篇

文章目录

配置线程池参数

定时任务线程池基础参数

yml 复制代码
# 定时任务线程池基础参数
task:
  pool:
    corePoolSize: 5 # 核心线程数
    maxPoolSize: 20 # 设置最大线程数
    keepAliveSeconds: 300 # 设置线程活跃时间,单位秒
    queueCapacity: 100 # 设置队列容量

定义参数实体bean

java 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @author snow
 * @Date 2024/4/8
 * @Description
 */
@ConfigurationProperties(prefix = "task.pool")
@Data
public class TaskThreadPoolInfo {
    
	// 核心线程池大小,即保持活动状态的最小线程数
	private Integer corePoolSize;
	
	// 最大线程池大小,即线程池允许创建的最大线程数
	private Integer maxPoolSize;
	
	// 非核心线程空闲时的存活时间,超过此时间,空闲线程将被终止
	private Integer keepAliveSeconds;
	
	// 阻塞队列容量,用于存放等待执行的任务
	private Integer queueCapacity;
}

配置线程池

在配置类中配置:

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author snow
 * @Date 2024/4/8
 * @Description
 */
@Configuration
@EnableConfigurationProperties(TaskThreadPoolInfo.class)
@Slf4j
public class TaskExecutePool {
    
    private TaskThreadPoolInfo info;

    public TaskExecutePool(TaskThreadPoolInfo info) {
        this.info = info;
    }

    /**
     * 定义任务执行器
     * @return
     */
    @Bean(name = "threadPoolTaskExecutor",destroyMethod = "shutdown")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
         //构建线程池对象
         ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
         
         //核心线程数:核心线程数(获取硬件):线程池创建时候初始化的线程数
         taskExecutor.setCorePoolSize(info.getCorePoolSize());
         
         //最大线程数:只有在缓冲队列满了之后才会申请超过核心线程数的线程
         taskExecutor.setMaxPoolSize(info.getMaxPoolSize());
         
         //缓冲队列:用来缓冲执行任务的队列
         taskExecutor.setQueueCapacity(info.getQueueCapacity());
         
         //允许线程的空闲时间:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
         taskExecutor.setKeepAliveSeconds(info.getKeepAliveSeconds());
         
         //线程名称前缀
         taskExecutor.setThreadNamePrefix("XXXX-");
         
         //设置拒绝策略
         // taskExecutor.setRejectedExecutionHandler(rejectedExecutionHandler());
         
         //参数初始化
         taskExecutor.initialize();
         return taskExecutor;
    }

    /**
     * 自定义线程拒绝策略
     * @return
     */
  	/**
    @Bean
    public RejectedExecutionHandler rejectedExecutionHandler(){
        RejectedExecutionHandler errorHandler = new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor) {
                //TODO 可自定义Runable实现类,传入参数,做到不同任务,不同处理
                log.info("股票任务出现异常:发送邮件");
            }
        };
        return errorHandler;
    } */
}

使用

注入线程池bean:

java 复制代码
    /**
     * 注入线程池对象
     */
    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;


//要求:将集合分组,每组的集合长度为20
   Lists.partition(ids, 20).forEach(ids->{
      //每个分片的数据开启一个线程异步执行任务
      threadPoolTaskExecutor.execute(()->{
     	  //解析数据
          List<PO> list = XXX;//
          XXmapper.insertBatch(list);
      });
   });
相关推荐
xuzhiqiang07243 分钟前
Java进阶之路,Java程序员职业发展规划
java·开发语言
时艰.27 分钟前
订单系统历史数据归档方案
java
MediaTea30 分钟前
Python:生成器表达式详解
开发语言·python
一只叫煤球的猫2 小时前
ThreadForge v1.1.0 发布:让 Java 并发更接近 Go 的开发体验
java·后端·性能优化
overmind2 小时前
oeasy Python 115 列表弹栈用pop删除指定索引
开发语言·python
014.3 小时前
2025最新jenkins保姆级教程!!!
java·运维·spring boot·spring·jenkins
浣熊8883 小时前
天机学堂虚拟机静态ip无法使用(重启后ip:192.168.150.101无法使用连接Mobaxterm数据库等等,或者无法使用修改之后的Hosts域名去访问nacos,jenkins)
java·微服务·虚拟机·天机学堂·重启之后静态ip用不了
心 -3 小时前
java八股文IOC
java
Never_Satisfied3 小时前
在c#中,使用windows自带功能将文件夹打包为ZIP
开发语言·windows·c#
hnxaoli3 小时前
win10程序(十六)通达信参数清洗器
开发语言·python·小程序·股票·炒股