メソッド
execute(Java.lang.Runnable)
で新しいタスクが送信され、実行中のスレッドがcorePoolSize
未満の場合、他のワーカースレッドがアイドル状態であっても、リクエストを処理するための新しいスレッドが作成されます。
1)アイドルスレッドがある場合、リクエストを処理するために新しいスレッドを作成する必要があるのはなぜですか?
実行中のスレッドが
corePoolSize
より多いがmaximumPoolSize
より少ない場合、キューがいっぱいの場合にのみ、新しいスレッドが作成されます。
2)corePoolSize
とmaximumPoolSize
の違いがわかりません。次に、スレッドがmaximumPoolSize
未満の場合、キューをどのようにいっぱいにすることができますか?キューがいっぱいになるのは、スレッドがmaximumPoolSize
以上の場合のみです。だよね?
スレッド作成に関するSunのルールを簡単に説明します。
Corepoolsizeおよびmaxpoolsizeという用語の定義は、javadocにあります。 http://docs.Oracle.com/javase/6/docs/api/Java/util/concurrent/ThreadPoolExecutor.html
上記のリンクはあなたの質問への答えを持っています。ただし、明確にするためです。アプリケーションは、corePoolSizeに達するまでスレッドを作成します。つまり、これらのスレッド数は、タスクの流入を処理するのに十分であるべきです。その後、タスクはキューに入れられます。キューがいっぱいになると、executorは新しいスレッドの作成を開始します。それは一種のバランスです。それが本質的に意味することは、タスクの流入が処理能力以上であることです。したがって、Executorはスレッドの最大数に達するまで、新しいスレッドの作成を再開します。ここでも、キューがいっぱいの場合にのみ、新しいスレッドが作成されます。
コアおよび最大プールサイズ
ThreadPoolExecutorは、corePoolSizeおよびmaximumPoolSizeによって設定された境界に従ってプールサイズを自動的に調整します。
メソッドexecute(Java.lang.Runnable)
で新しいタスクが送信され、実行中のcorePoolSizeスレッドより少ない場合、他のワーカースレッドがアイドル状態であっても、要求を処理するために新しいスレッドが作成されます。 corePoolSizeを超えてmaximumPoolSize未満のスレッドが実行されている場合、キューがいっぱいの場合にのみ新しいスレッドが作成されます.corePoolSizeとmaximumPoolSizeを同じに設定することで、固定サイズのスレッドプールを作成します。
MaximumPoolSizeを_Integer.MAX_VALUE
_などの本質的に無制限の値に設定することで、プールが任意の数の並行タスクに対応できるようになります。最も一般的には、コアおよび最大プールサイズは構築時にのみ設定されますが、setCorePoolSize(int)
およびsetMaximumPoolSize(int)
を使用して動的に変更することもできます。 リンク