• springboot异步线程池


    项目中经常会遇到线程池异步处理一些任务

    1.配置信息

    # 异步线程配置
    # 核心线程数
    async:
      executor:
         thread:
           core_pool_size: 10
      # 最大线程数
           max_pool_size: 100
      # 任务队列大小
           queue_capacity: 20
      # 线程池中线程的名称前缀
           name:
             prefix: kc-async-service-
      # 缓冲队列中线程的空闲时间
           keep_alive_seconds: 100
           await_termination_seconds: 60

    2.公共配置类:

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.AsyncConfigurer;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    import java.util.concurrent.Executor;
    import java.util.concurrent.ThreadPoolExecutor;
    
    @Configuration
    @EnableAsync
    @ComponentScan("com.gary.kc")
    public class AsyncConfig implements AsyncConfigurer {
        @Value("${async.executor.thread.core_pool_size}")
        private int corePoolSize;
        @Value("${async.executor.thread.max_pool_size}")
        private int maxPoolSize;
        @Value("${async.executor.thread.queue_capacity}")
        private int queueCapacity;
        @Value("${async.executor.thread.name.prefix}")
        private String namePrefix;
        @Value("${async.executor.thread.keep_alive_seconds}")
        private int keepAliveSeconds;
        @Value("${async.executor.thread.await_termination_seconds}")
        private int awaitTerminationSeconds;
        @Override
        @Bean("AsyncExecutor")
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
            //返回可用处理器的Java虚拟机的数量,可以根据数量设定线程参数,我这里直接写死了
            int i = Runtime.getRuntime().availableProcessors();
            //设置核心线程数
            threadPool.setCorePoolSize(corePoolSize);
            //设置最大线程数
            threadPool.setMaxPoolSize(maxPoolSize);
            //线程池所使用的缓冲队列
            threadPool.setQueueCapacity(queueCapacity);
            //等待任务在关机时完成--表明等待所有线程执行完
            threadPool.setWaitForTasksToCompleteOnShutdown(true);
            // 等待时间 (默认为0,此时立即停止),并没等待xx秒后强制停止
            threadPool.setAwaitTerminationSeconds(awaitTerminationSeconds);
            //  线程名称前缀
            threadPool.setThreadNamePrefix(namePrefix);
            // 线程的空闲时间
            threadPool.setKeepAliveSeconds(keepAliveSeconds);
            // 拒绝策略
            threadPool.setRejectedExecutionHandler(new  ThreadPoolExecutor.CallerRunsPolicy());
            // 初始化线程
            threadPool.initialize();
            return threadPool;
        }
    
    }

    PS:线程池拒绝策略
     

     rejectedExectutionHandler参数字段用于配置绝策略,常用拒绝策略如下

    AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException
    CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
    DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
    DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。

    3.使用线程池

    @Async("AsyncExecutor")
    public void asyncBatchInsertCallList() {
        try {
            log.warn("start Batch Insert");

        } catch(Exception e){

         log.error("start Batch Insert error:{}",e);

     }

    4.总结

    多尝试,换个思路可能会更好。 

  • 相关阅读:
    【Semidrive】解决 X9HP reboot 导致 Android 崩溃的问题
    如何解决msvcp120.dll丢失问题,msvcp120.dll丢失的解决方法介绍
    基于ssm的旅游管理系统
    python经典百题之利用ellipse and rectangle 画图
    为何你的算法总是比别人的慢?【21天算法系列】之顺序查找算法【Java 版】
    vue中使用wangeditor富文本编辑器
    【Python】time模块和datetime模块的部分函数说明
    RSTP详解:对比STP,到底改进了什么?
    以太坊“共识层”客户端prysm和teku对比选型
    rtmp推流异常分析
  • 原文地址:https://blog.csdn.net/zy08403/article/details/134057922