Spring Boot 线程池使用


placeholder image
admin 发布于:2022-05-09 10:28:23
阅读:loading

在Spring Contex依赖的Scheduling包中存在Async注解和AsyncConfigurer接口,前者注解标记在方法上表示此方法为线程异步的方式调用,后者接口若被扩展则表示将项目环境中的默认线程池进行了覆盖实现,所有基于@Async默认的方法都将由此线程池托管,即Spring Boot架构的项目中若要实现某个功能模块的线程池时不建议去扩展此接口以至于覆盖默认的线程池(顺便提一下默认线程池的参数可在参数中使用spring.task.execution进行设置),而是依照此包路径中也提供的ThreadPoolTaskExecutor类,声明应用即可,简单示例参考如下所示:

package cn.chendd.core.spring.pool;

import ...;

/**
 * 简单线程参数配置类
 *
 * @author chendd
 * @date 2020/8/16 18:27
 */
@Configuration
@EnableAsync
public class SimplePoolExecutorConfiguaration implements AsyncConfigurer {

    @Resource
    private SimplePoolProperty poolProperty;

    @Bean(name = "simplePoolExecutor")
    public Executor simplePoolExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(poolProperty.getCorePoolSize());
        executor.setMaxPoolSize(poolProperty.getMaxPoolSize());
        executor.setQueueCapacity(poolProperty.getQueueCapacity());
        executor.setKeepAliveSeconds(poolProperty.getKeepAliveSeconds());
        executor.setThreadNamePrefix(poolProperty.getThreadNamePrefix());
        //调用shutdown被调用时等待当前被调度的任务完成
        executor.setWaitForTasksToCompleteOnShutdown(poolProperty.getWaitForTasksToCompleteOnShutdown());
        //当pool达到max size时的新线程处理方式:不在开启新的线程,由调用者所在线程执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

}

知识点说明

(1)实际应用时不必实现AsyncConfigurer接口,避免覆盖默认线程池;

(2)在application配置文件中定义spring.task.execution相关的参数设置默认线程池的参数;

(3)@Asnyc注解支持使用指定的某个线程池,引用的线程池名称为容器中的Executor类型的Bean组件;

(4)ThreadPoolTaskExecutor是Spring Context模块下提供的线程池实现,是对JDK线程池的封装;

(5)核心线程数量一般可以按照CPU的核心数的倍数指定,Runtime.getRuntime().availableProcessors()获取;

(6)若队列大小为正整数时构造LinkedBlockingQueue,否则构造SynchronousQueue类型;

(7)线程池的拒绝策略建议使用上例代码中的实现,不建议采用再开启线程的方式来扩展拒绝策略,因为服务器进程中的线程数量范围是有限的,若无脑开启线程会出现OOM错误,即:unable to create new native thread;


 点赞


 发表评论

当前回复:作者

 评论列表


留言区