2013-07-15 13 views
13

新しいタスクが方法execute(java.lang.Runnable)に提出され、かつより少ないcorePoolSizeスレッドが実行されている場合は、新しいスレッドが他のワーカースレッドがアイドル状態であっても、リクエストを処理するために作成されるのサイズ。ThreadPoolExecutor - コアおよび最大プールは

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

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

2)corePoolSizemaximumPoolSizeの違いはわかりません。次に、スレッドがmaximumPoolSizeより小さい場合、どのようにキューがいっぱいになるのでしょうか?スレッドがmaximumPoolSize以上の場合、キューは満杯になります。ではない?

+1

1.()あなたの他のワーカースレッドがアイドル状態であることを知っていますか?あなたは彼らと一緒にやったときにプールに戻しましたか? –

+0

2. ThreadPoolExecutorがcorePoolSizeより大きいがmaximumPoolSizeより小さい使用可能なスレッドのプールを維持しようとしているようです。 –

+0

@RobertHarveyこれを回答として投稿してください。 – zEro

答えて

8

javadocでcorepoolsizeおよびmaxpoolsizeという用語の定義を見つけることができます。 http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

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

5

コアと最大プールサイズ

A ThreadPoolExecutorは自動的にcorePoolSizeとmaximumPoolSizeによって設定された範囲に応じて、プール・サイズを調整します。

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

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

+0

可読性を高めるために、回答の書式を設定してください。 – harpun

14

は、簡単な言葉でスレッドの作成のためのSunのルールです:

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

Full article

関連する問題