現在、次のことを行うコンストラクトがあります。
多数X
のスレッド (X
ユーザーからの構成可能な変数) がすべて開始され、タスクが使用可能になるのを待ちます。block
で待機しているスレッドBlockingQueue
。
別のスレッドがタスクをブロッキング キューに入れ、ブロックされたスレッドがタスクとrun
それらを受け取り、次のタスクに戻りwait
ます。
とにかくこれはうまくいきますが、次の問題があります。X
2 時間タスクがなくても、スレッドは常にタスクを待機しています。
またX
、たとえば X/50 タスクしか入っていない場合でも、実際にはスレッドを使用できます (つまり、実際に必要な数よりもはるかに多くのスレッドがあります)。
だから私の質問は、必要に応じて上下するように、これExecutors
を (おそらく を使用して)
どのようにリファクタリングできますか?
私の目標は、パフォーマンスを失わないことです。つまり、必要以上のスレッドを持つことができますが (リソースを浪費します)、新しいスレッドを作成するオーバーヘッドはありません。
リソースを無駄にせず、同じパフォーマンス レベルを維持できるように、これをリファクタリングすることに関心があります。 X
3 に答える
1
通常の ThreadPoolExecutorで十分です。基本的なコンストラクターは、「コア プール サイズ」(常にアライブ状態にしておくスレッドの最小量)、最大サイズ (スレッドの最大量)、および超過スレッド (コア プール サイズを超えるアイドル スレッド) のキープ アライブ時間のパラメーターを受け取ります。また、BlockingQueue をエグゼキュータに直接渡すこともできます。
于 2012-08-05T10:42:59.377 に答える
0
ユースケースはすでにExecutorService.newCachedThreadPoolExecutorに実装されています。とにかく、私はあなたが柔軟なスレッドプールを得るためにあなたが様々なことをすることができる実装を進めたいです。
そのような可能性を1つ挙げます
- キューを保持し、ワークユニット(タスク)をさまざまなスレッドに割り当てるマスタースレッドを記述します。また、実行中のスレッド、結果ユニットを返したスレッド、およびブロックされたスレッドを維持します。この情報を使用して、マスタースレッドは必要に応じて簡単に負荷分散し、スレッド(スレーブ)を作成/破棄できます。
于 2012-08-05T11:13:41.520 に答える
0
1.を使用してみてください。リサイクルCachedThreadPool
するだけでなく、必要に応じて新しいスレッドを作成します。
2.の最も優れた機能は、スレッドが 60 秒間アクティブでCachedThreadPool
ない場合、スレッドが強制終了されることです。リソースの浪費はありません。
于 2012-08-05T10:41:33.197 に答える