1. 程式人生 > 程式設計 >SpringBoot2執行緒池定義使用方法解析

SpringBoot2執行緒池定義使用方法解析

我們都知道spring只是為我們簡單的處理執行緒池,每次用到執行緒總會new 一個新的執行緒,效率不高,所以我們需要自定義一個執行緒池。

定義執行緒池

@Slf4j
@EnableAsync
@Configuration
public class AsyncExecutorConfig implements AsyncConfigurer {

  @Bean
  public ThreadPoolTaskExecutor asyncServiceExecutor() {
    //返回可用處理器的虛擬機器的最大數量不小於1
    int cpu = Runtime.getRuntime().availableProcessors();
    log.info("start asyncServiceExecutor cpu : {}",cpu);
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    //配置核心執行緒數
    executor.setCorePoolSize(cpu);
    //配置最大執行緒數
    executor.setMaxPoolSize(cpu);
    //配置佇列大小
    executor.setQueueCapacity(50);
    //用來設定執行緒池關閉的時候等待所有任務都完成再繼續銷燬其他的Bean
    executor.setWaitForTasksToCompleteOnShutdown(true);
    //設定執行緒池中任務的等待時間,如果超過這個時候還沒有銷燬就強制銷燬,以確保應用最後能夠被關閉,而不是阻塞住
    executor.setAwaitTerminationSeconds(60);
    //配置執行緒池中的執行緒的名稱字首
    executor.setThreadNamePrefix("async-service-");
    // rejection-policy:當pool已經達到max size的時候,如何處理新任務
    // CALLER_RUNS:不在新執行緒中執行任務,而是有呼叫者所在的執行緒來執行
    // 使用預定義的異常處理類
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    //執行初始化
    executor.initialize();
    return executor;
  }

  @Override
  public Executor getAsyncExecutor() {
    return asyncServiceExecutor();
  }

  @Override
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return (throwable,method,objects) -> {
      StringBuilder sb = new StringBuilder();
      for (Object param : objects) {
        sb.append(param).append(",");
      }
      log.error("Exception message - {},Method name - {},Parameter value - {}",throwable.getMessage(),method.getName(),sb.toString());
    };

  }
}

如何使用

@Autowired  
private ThreadPoolTaskExecutor threadPoolTaskExecutor;

public void test(){
 CompletableFuture<Void> userFuture = CompletableFuture.runAsync(() -> System.out.println(111),threadPoolTaskExecutor);
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。