SpringBoot配置多线程池

1 设置properties 文件

@Component
@Data
@ConfigurationProperties("thread-pool")
public class ThreadPoolProperties {

    private int corePoolSize;
    private int maxPoolSize;
    private int queueCapacity;
    private int keepAliveSeconds;
    private String threadPrefix;
    private String name;
    
}

2 解析properties 文件

@Slf4j
@Configuration
@ConditionalOnClass(ThreadPoolProperties.class)
public class ThreadPoolAutoConfiguration {

    @Bean
    public static ThreadPoolBeanDefinitionRegistryPostProcessor threadPoolBeanDefinitionRegistryPostProcessor() {
        return new ThreadPoolBeanDefinitionRegistryPostProcessor();
    }


    static class ThreadPoolBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware {
        //
        private static final String POOL_PREFIX = "thread-pool";

        private Environment environment;

        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
            List<ThreadPoolProperties> poolProperties = new ArrayList<>();

            ThreadPoolProperties p = Binder.get(environment).bind(POOL_PREFIX, Bindable.of(ThreadPoolProperties.class)).orElse(null);
            if (p != null) {
                poolProperties.add(p);
            } else {
                // 多消费者配置
                List<ThreadPoolProperties> propertiesList = Binder.get(environment).bind(POOL_PREFIX, Bindable.listOf(ThreadPoolProperties.class)).orElse(Collections.emptyList());
                if (CollectionUtils.isNotEmpty(propertiesList)) {
                    poolProperties.addAll(propertiesList);
                }
            }

            if (CollectionUtils.isEmpty(poolProperties)) {
                return;
            }

            poolProperties.stream().forEach(properties->{
                log.info("start " + properties.getThreadPrefix());
                ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
                //配置核心线程数
                executor.setCorePoolSize(properties.getCorePoolSize());
                //配置最大线程数
                executor.setMaxPoolSize(properties.getMaxPoolSize());
                //配置队列大小
                executor.setQueueCapacity(properties.getQueueCapacity());
                //配置线程池中的线程的名称前缀
                executor.setThreadNamePrefix(properties.getName()+"_");
                // rejection-policy:当pool已经达到max size的时候,如何处理新任务
                // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
                executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                //执行初始化
                executor.initialize();

                BeanFactory.addPool(properties.getName(), executor);
            });

        }

        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

        }

        @Override
        public void setEnvironment(Environment environment) {
            this.environment = environment;
        }
    }
}

为了可以通过名称获取,我放了一个map

public class BeanFactory {
    public static final ConcurrentHashMap<String, Executor> threadPoolMap = new ConcurrentHashMap<>();

    public static void addPool(String name,Executor executor){
        threadPoolMap.put(name,executor);
    }

    public static Executor getPool(String name){
        return threadPoolMap.get(name);
    }


}

3 application.yml 配置

thread-pool:
  - corePoolSize: 9
    maxPoolSize: 9
    queueCapacity: 100
    keepAliveSeconds: 120
    name: testPool
  - corePoolSize: 10
    maxPoolSize: 10
    queueCapacity: 100
    keepAliveSeconds: 120
    name: testPool1

关联知识点
BeanDefinitionRegistryPostProcessor,Bean 生命周期的后置处理器
beanDefinitionRegistry.registerBeanDefinition(properties.getName(), BeanDefinitionBuilder.
genericBeanDefinition(ThreadPoolTaskExecutor.class, () -> executor).getBeanDefinition());

这种写法也可以用InitializingBean
todo
拒绝策略可以通过配置雷鸣解析完成

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,实现异步多线程可以通过使用`@Async`注解来实现。首先,你需要创建一个异步线程类,并在类上加上`@Component`注解,标识为一个组件类。在该类的方法上加上`@Async`注解,表示该方法是异步执行的。 在启动类上添加`@EnableAsync`注解,开启异步任务的支持。 接下来,你可以通过默认的线程池来执行异步任务。在需要异步执行的方法上添加`@Async`注解,就可以实现异步调用了。 如果你想自定义线程池,有几种方式可以实现。一种是通过在`application.yml`配置文件中设置线程池的参数,另一种是实现`AsyncConfigurer`接口或继承`AsyncConfigurerSupport`类来自定义线程池,还可以直接在配置类中配置自定义的`TaskExecutor`。 总之,使用Spring Boot实现异步多线程可以提高程序的并发处理能力和性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringBoot实现异步多线程](https://blog.csdn.net/hyj_king/article/details/103455143)[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%"] - *2* [SpringBoot @Async异步多线程](https://blog.csdn.net/lemon_TT/article/details/122905103)[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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值