【Java】TaskExecutorについて
- 実行環境
- TaskExecutorの種類
- ThreadPoolTaskExecutorの設定値
- ThreadPoolTaskExecutorのデフォルト値
- TaskExecutorの設定方法
- 参考文献
実行環境
TaskExecutorの種類
- SimpleAsyncTaskExecutorとかConcurrentTaskExecutorとか色々ある
- ThreadPoolTaskExecutorが一般的だから、ThreadPoolTaskExecutorを使えばよい
- Spring BootのデフォルトはThreadPoolTaskExecutor
ThreadPoolTaskExecutorの設定値
- corePoolSizeまでThreadを作る
- corePoolSizeが一杯になるとqueueCapacityまでキューイングする
- queueCapacityを越えるとmaxPoolSizeまでThreadを増やす
- maxPoolSizeを越えるとrejectされる
- 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; } }