【Java】TaskExecutorについて

実行環境

TaskExecutorの種類

  • SimpleAsyncTaskExecutorとかConcurrentTaskExecutorとか色々ある
  • ThreadPoolTaskExecutorが一般的だから、ThreadPoolTaskExecutorを使えばよい
  • Spring BootのデフォルトはThreadPoolTaskExecutor

ThreadPoolTaskExecutorの設定値

  1. corePoolSizeまでThreadを作る
  2. corePoolSizeが一杯になるとqueueCapacityまでキューイングする
  3. queueCapacityを越えるとmaxPoolSizeまでThreadを増やす
  4. maxPoolSizeを越えるとrejectされる
  5. corePoolSizeを超えたThreadはkeepAliveSecondsまで生存する

ThreadPoolTaskExecutorのデフォルト値

Springの場合

  • corePoolSize:1
  • queueCapacity:無制限(Integer.MAX_VALUE
  • maxPoolSize:無制限(Integer.MAX_VALUE
  • keepAliveSeconds:60秒

Spring Bootの場合

  • corePoolSize:8
  • queueCapacity:無制限(Integer.MAX_VALUE
  • maxPoolSize:無制限(Integer.MAX_VALUE
  • keepAliveSeconds:60秒

TaskExecutorの設定方法

メソッドレベル

任意のExecutorをBean定義する

@Configuration
public class AsyncConfiguration {

    @Bean("taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setThreadNamePrefix("AsyncThread-");
        executor.initialize();
        return executor;
    }
}

アプリケーションレベル

AsyncConfigurer.getAsyncExecutor()をオーバーライドする

@Configuration
public class AsyncConfiguration implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setThreadNamePrefix("AsyncThread-");
        executor.initialize();
        return executor;
    }
}

参考文献

Executor/TaskExecutorとは

docs.oracle.com

spring.pleiades.io

www.ibm.com

TaskExecutorの使い方

kazuhira-r.hatenablog.com

docs.spring.io

スレッドプールについて

www.baeldung.com

ThreadPoolTaskExecutorの設定について

ik.am

www.baeldung.com

ThreadPoolTaskExecutorのデフォルト値

spring.pleiades.io

docs.spring.io