content: package com.xiliu.common.config;
  
  
  import com.xiliu.common.utils.ThreadsUtils;
  import org.apache.commons.lang3.concurrent.BasicThreadFactory;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  
  import java.util.concurrent.ScheduledExecutorService;
  import java.util.concurrent.ScheduledThreadPoolExecutor;
  import java.util.concurrent.ThreadPoolExecutor;
  
  /**
   * @author xiliu
   * @description 线程池配置
   * @date 2022/7/25
   */
  @Configuration
  public class ThreadPoolConfig {
  
      /**
       * 核心线程池大小
       **/
      private int corePoolSize = 50;
      /**
       * 最大可创建的线程数
       **/
      private int maxPoolSize = 200;
      /**
       * 队列最大长度
       **/
      private int queueCapacity = 1000;
      /**
       * 线程池维护线程所允许的空闲时间
       **/
      private int keepAliveSeconds = 300;
  
      @Bean(name = "threadPoolTaskExecutor")
      public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
          ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
          executor.setMaxPoolSize(maxPoolSize);
          executor.setCorePoolSize(corePoolSize);
          executor.setQueueCapacity(queueCapacity);
          executor.setKeepAliveSeconds(keepAliveSeconds);
          // 线程池对拒绝任务(无线程可用)的处理策略
          executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
          return executor;
      }
  
      /**
       * 执行周期性或定时任务
       */
      @Bean(name = "scheduledExecutorService")
      protected ScheduledExecutorService scheduledExecutorService() {
          return new ScheduledThreadPoolExecutor(corePoolSize, new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
                  new ThreadPoolExecutor.CallerRunsPolicy()) {
                  @Override
                  protected void afterExecute(Runnable r, Throwable t) {
                      super.afterExecute(r, t);
                      ThreadsUtils.printException(r, t);
                  }
              };
          }
  
  
  }
  