SpringBoot環境でマルチスレッド処理を行う機会があり、これらの設定値の意味が分かりづらかったので記載。
設定
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setQueueCapacity(3);
executor.setMaxPoolSize(3);
executor.initialize();
それぞれ何の値なのか?
CorePoolSize...スレッドプール内で待機しているスレッドの初期数。
QueueCapacity...CorePoolSize分のスレッドがすべて実行中の時にタスクが投げ込まれると、既存のスレッドに対して待ちタスクが発生する。その待ちタスクの最大値。
MaxPoolSize...タスクが投げられ続け待ちタスクが最大値を超えると、スレッドが増えていく。MaxPoolSizeより多くのスレッドは生成されない。
※QueueCapacityとMaxPoolSizeをともに超えてタスクが投げられ続けると、タスクが実行できずRejectedExecutionException
がthrowされる。
ラーメン屋の行列で喩えると
CorePoolSize...店内に人が入りきらなくなった時にできる、最初の列(スレッド)の数。
QueueCapacity...1列に並ぶことが出来る人の数。1列に並んでいる人の数がこれを超えると、列(スレッド)が増えていく。
MaxPoolSize...列を配置できる最大数。道幅的な都合で
スレッドプールの図解
オレンジの丸(塗りつぶし)...タスク
オレンジの丸(塗りつぶしなし)...待ち行列。タスクは割り当てられていない
青四角...スレッド
1.下記設定でスレッドプール作成。次々とタスクが入ってくる。
2.スレッドがすべて埋まったので、待ち行列にタスクが入り始める
4.スレッドも待ち行列も埋まったので、CorePoolSizeを超えてスレッドが作成され始める
5.スレッド数がMaxPoolSizeを超えてタスクが割り当てられると、実行できずRejectedExecutionException発生