2016-08-09 2 views
2

Java ThreadPoolExecutorでは、次の2つのシナリオではどうなりますか?いつFIxedサイズのスレッドプールを使用するのですか?

1) Fixed Size ThreadPool 
    CoreThreadPool size = 5 
    MaximumThreadPool size = 5 
    Queue size = unbounded 
Maximum no.of threads that can run simultaneously=? 

2) Variable size ThreadPool 
    CoreThreadPool size = 5 
    MaximumThreadPool size = 10 
    Queue size = unbounded 
Maximum no.of threads that can run simultaneously=? 

また、これらの両方のケースを使用する場合は、

+0

"corePoolSize以上で実行中のスレッドがmaximumPoolSize未満の場合、キューがいっぱいになった場合にのみ新しいスレッドが作成されます。 - [ThreadPoolExecutor](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html)から。したがって、無制限のキューを使用すると、示された可変サイズのスレッドプールの設定で、corePoolSize **より上のスレッド数は決して得られません。 – Fildor

答えて

2

唯一の違いは、2番目の設定では最大10個のスレッドで実行できることです。最初のものは5で始まります。それ以上のことは起こさないでしょう。

さらに多くのスレッドを実行するときに、パフォーマンス/スループット/ ...が増えないことがわかったら、最初のセットアップを使用します。一方、固定サイズとは、常に5(または10)のスレッドが存在することを意味します。その意味で、この種のスレッドプールは "静的"な環境で最も理にかなっています。あなたの「負荷」が時間の経過とともに大きく変化していない場所。 5つのスレッドが10のスレッドに適した作業をすることは望ましくありませんが、5つのスレッドが十分に機能するため、10スレッドが大部分の時間待機しないようにする必要もありません。

他の言葉で言えば、それはあなたの全体の設定に大きく依存します。多くのスレッドが「最良の」結果をもたらすかどうかを判断するために使用されます。だから疑いがあるときには、慎重なプロファイリングを行うべきです。最大スレッド数のような変数の変更をテストします。もちろん、すべてのことは、アプリケーションのパフォーマンス/動作を測定する良い手段が必要です。

+0

私は固定サイズのスレッドプールがアイドル時にスレッドを死に至らせないというヒントを追加します。あなたが(ほぼ)一定の負荷を期待するならば、_indicator_は固定サイズになるでしょう。一時的に高い負荷に対処するために** burstと**スレッドが必要な場合は、可変サイズで処理するので、より多くのスレッドが一時的にしかなく、スレッドが少なくて済むようになります。 – Fildor

+0

ありがとうございます。それに応じて私の答えを更新しました。 – GhostCat

関連する問題