LoginSignup
1
3

More than 1 year has passed since last update.

SpringBootで非同期する時の設定値をラーメン屋の行列に喩える

Last updated at Posted at 2021-07-18

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.下記設定でスレッドプール作成。次々とタスクが入ってくる。
Multithread図解_page-0001.jpg

2.スレッドがすべて埋まったので、待ち行列にタスクが入り始める
Multithread図解_page-0002.jpg

3.続々とタスクが増える
Multithread図解_page-0003.jpg

4.スレッドも待ち行列も埋まったので、CorePoolSizeを超えてスレッドが作成され始める
Multithread図解_page-0004.jpg

5.スレッド数がMaxPoolSizeを超えてタスクが割り当てられると、実行できずRejectedExecutionException発生
Multithread図解_page-0005.jpg

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3