3

ジョブをスレッド プールにディスパッチするメイン スレッドがあります。Java の Executor フレームワークを使用しています。

プロファイラー (VirtualVM) から、各スレッドのアクティビティを確認できます。メイン スレッドが大量に待機していることがわかります (エグゼキューターのキューには上限があるため)。ただし、executor のスレッドは、私が思っていたほどビジーではありません。それらのほとんどは、75% の待ち時間があります。virtualVM では、Monitor で待機していると表示されます。

なぜこれが起こっているのか誰か説明できますか?実行できる作業がまだたくさんあるのに、なぜエグゼキュータ スレッドが待機するのでしょうか? そして、エグゼキュータのパフォーマンスを向上させる方法は? したがって、全体的なパフォーマンスを向上させるには?エグゼキューターのモニターでの待機に関する詳細は素晴らしいでしょう。

ワーカーで実行されるジョブは単なる計算であり、他のものに依存せず、他のスレッドと通信しません (同期なし)。ただし、最終的には、独自の接続を使用してデータベースにデータを配置します.

4

4 に答える 4

3

次の場合、並列実行は同期実行よりもはるかに優れた結果をもたらします。

  1. 実行する作業が互いに独立している (重要なセクションがまったくないか、ほとんどなく、非常に短い)

  2. 実行された各作業は、スレッドの開始/エグゼキューターの内部同期を補うのに十分な時間がかかります

  3. 作業は同じリソースを使用しません。たとえば、同じディスクから複数のファイルを読み取ると、それらを順次読み取るよりもおそらく遅くなります。

  4. 一度に使用するのに十分なシステム リソース (プロセッサ コア、メモリ、ネットワーク速度) が実際にある

于 2013-05-08T14:08:12.220 に答える
0

スレッドは、それらを実行するために CPU サイクルを割り当てるようにスケジューラによってスケジュールされます。つまり、マシンに 4 つの CPU がある場合、一度に 4 つのスレッドしか並列に実行できないため、他のスレッドは、スケジューラが CPU を割り当てるのを待つ必要があります。

于 2013-05-08T14:08:35.100 に答える