0

Thread Pool Executor を使用して従来の設計を変更する作業を行っています。詳細は次のとおりです。

レガシー:- レガシー設計の場合、アプリケーションの起動時に 600 のスレッドが作成されます。さまざまなプールに配置され、必要に応じて取得され、対応するスレッドにタスクが割り当てられます。

New:- 新しい設計では、スレッド プールを executor サービスに置き換えました。

 ThreadPoolExecutor thpool = new ThreadPoolExecutor(coreSize,poolsize,...);

私が観察しているのは、Executor の場合、起動時にスレッドが作成されないことです。クライアントからリクエストが発行されたときに作成されます。その結果、メモリ内に作成されたスレッドは、以前のものと比較してかなり少なくなっています。

しかし、スレッドの作成は呼び出し時に発生するオーバーヘッドでもあるため、それは正しい方法です。

クライアントからの呼び出し時にスレッドを作成するプロセスと、従来のアプローチに従ってメモリ内に存在するアイドル スレッドのどちらが重いか教えてください。

また、パフォーマンスに関して最良の結果を得るために、どの Executor プールを使用するかを提案します。

4

3 に答える 3

1

起動時に 600 スレッドを修正するには、java.util.concurrent.Executors.newFixedThreadPool( 600 );を使用してみてください。

無制限の共有キューで動作する固定数のスレッドを再利用するスレッド プールを作成します。どの時点でも、最大で nThreads スレッドがアクティブな処理タスクになります。すべてのスレッドがアクティブなときに追加のタスクが送信されると、それらのタスクは、スレッドが使用可能になるまでキューで待機します。シャットダウン前の実行中に障害が発生していずれかのスレッドが終了した場合、後続のタスクを実行する必要がある場合は、新しいスレッドが代わりに使用されます。プール内のスレッドは、明示的にシャットダウンされるまで存在します。

ご覧のとおり、ドキュメントには、スレッドがすぐに開始されるかオンデマンドで開始されるかは記載されていません。

起動時に 600 個のスレッドを開始したい場合は、600 個の空のタスクを投稿できます。

for( int i = 0; i < 600; ++i ) {
   executor.submit( new Runnable(){public void run(){/**/}});
}
于 2013-09-29T09:04:24.770 に答える
0

あなたは呼び出すことができます:

thpool.prestartAllCoreThreads();

また

thpool.prestartCoreThread();

この 2 つのメソッドは、コア スレッド (スレッド) を開始し、作業を待機させます。

しかし、私はこれをしないことをお勧めします。それはあなたのリソースに頭を悩ませます.

于 2013-09-29T09:36:01.843 に答える
0

600は多いように聞こえます。利用可能なプロセッサの数まで、これをいくらか下げたいと思うかもしれません。Runnablesまたは、スレッドが長時間待機することになり、スレッドが 100% CPU バウンドでない場合は、TPE で発生する平均負荷を考慮に入れます。スレッドに と の平均負荷があるnCPUs=Runtime.getRuntime().availableProcessors()loadFactorします (テストまたは継続的な監視で観察されたように)。次に、nThreads=nCPUs/loadFactor を使用し、loadFactor がゼロでないことを望みます。

より小さなコアサイズとより大きなプールサイズを使用することもできますが、その場合はバインドされたキューが必要になります。この場合の TPE は、キューがいっぱいになると、プールサイズに達するまで新しいスレッドを開始します。ジョブの大部分がコアサイズ内で処理される場合、スレッドの作成が頻繁になりすぎず、オーバーヘッドが問題になることはありません。ただし、TPE で最大のスレッドが実行されると、これでも最終的にブロックされる可能性があります。

ジョブが、ブロックしてはならない他の接続のソケットからの読み取りなど、ある種の受信作業である場合、無制限の中間キューを作成して、最終的に TPE でのブロックから受信処理を解放し、別のスレッドを使用して中間からジョブを送信できます。 TPE キューに。

于 2013-09-29T10:10:02.883 に答える