web-dev-qa-db-ja.com

ThreadPoolExecutor-コアおよび最大プールサイズ

メソッドexecute(Java.lang.Runnable)で新しいタスクが送信され、実行中のスレッドがcorePoolSize未満の場合、他のワーカースレッドがアイドル状態であっても、リクエストを処理するための新しいスレッドが作成されます。

1)アイドルスレッドがある場合、リクエストを処理するために新しいスレッドを作成する必要があるのはなぜですか?

実行中のスレッドがcorePoolSizeより多いがmaximumPoolSizeより少ない場合、キューがいっぱいの場合にのみ、新しいスレッドが作成されます。

2)corePoolSizemaximumPoolSizeの違いがわかりません。次に、スレッドがmaximumPoolSize未満の場合、キューをどのようにいっぱいにすることができますか?キューがいっぱいになるのは、スレッドがmaximumPoolSize以上の場合のみです。だよね?

16
user2568266

スレッド作成に関するSunのルールを簡単に説明します。

  1. スレッド数がcorePoolSize未満の場合は、新しいスレッドを作成して新しいタスクを実行します。
  2. スレッドの数がcorePoolSizeと等しい(またはそれより大きい)場合、タスクをキューに入れます。
  3. キューがいっぱいで、スレッドの数がmaxPoolSize未満の場合は、タスクを実行する新しいスレッドを作成します。
  4. キューがいっぱいで、スレッドの数がmaxPoolSize以上の場合、タスクを拒否します。

記事全体

24
taynguyen

Corepoolsizeおよびmaxpoolsizeという用語の定義は、javadocにあります。 http://docs.Oracle.com/javase/6/docs/api/Java/util/concurrent/ThreadPoolExecutor.html

上記のリンクはあなたの質問への答えを持っています。ただし、明確にするためです。アプリケーションは、corePoolSizeに達するまでスレッドを作成します。つまり、これらのスレッド数は、タスクの流入を処理するのに十分であるべきです。その後、タスクはキューに入れられます。キューがいっぱいになると、executorは新しいスレッドの作成を開始します。それは一種のバランスです。それが本質的に意味することは、タスクの流入が処理能力以上であることです。したがって、Executorはスレッドの最大数に達するまで、新しいスレッドの作成を再開します。ここでも、キューがいっぱいの場合にのみ、新しいスレッドが作成されます。

8
Braj Kishore

コアおよび最大プールサイズ

ThreadPoolExecutorは、corePoolSizeおよびmaximumPoolSizeによって設定された境界に従ってプールサイズを自動的に調整します。

メソッドexecute(Java.lang.Runnable)で新しいタスクが送信され、実行中のcorePoolSizeスレッドより少ない場合、他のワーカースレッドがアイドル状態であっても、要求を処理するために新しいスレッドが作成されます。 corePoolSizeを超えてmaximumPoolSize未満のスレッドが実行されている場合、キューがいっぱいの場合にのみ新しいスレッドが作成されます.corePoolSizeとmaximumPoolSizeを同じに設定することで、固定サイズのスレッドプールを作成します。

MaximumPoolSizeを_Integer.MAX_VALUE_などの本質的に無制限の値に設定することで、プールが任意の数の並行タスクに対応できるようになります。最も一般的には、コアおよび最大プールサイズは構築時にのみ設定されますが、setCorePoolSize(int)およびsetMaximumPoolSize(int)を使用して動的に変更することもできます。 リンク

6
Adelin