• 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.总结

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

  • 相关阅读:
    七大排序。。。
    【Java】传输层协议TCP
    小程序需带参数跳转
    PHP中isset() empty() is_null()的区别
    [Python进阶] Pyinstaller关于spec文件
    从0到1学SpringCloud——12 gateway 动态配置网关路由规则
    策略模式在springboot中的使用
    Windows和Linux上使用Prometheus+Grafana监控Springboot
    Html关于worker的使用
    xubuntu16.04系统中隐藏网络连接的弹窗提示
  • 原文地址:https://blog.csdn.net/zy08403/article/details/134057922