私のJavaプログラムはjava.util.concurrent.Executorを使用して複数のスレッドを実行し、それぞれが実行可能なクラスを開始し、そのクラスでC:ドライブ上のコンマ区切りのテキストファイルから読み取り、行をループしてテキストを分割してフロートに解析します、その後、データは次の場所に保存されます。
static Vector
static ConcurrentSkipListMap
私の PC は Win 7 64 ビット、Intel Core i7、6 * 2 コアと 24GB の RAM を備えています。プログラムは 2 分間実行され、1700 個のファイルすべてを終了することに気付きましたが、CPU 使用率は 10% から 15% 程度しかありません。を使用して割り当てたスレッドの数に関係なく:
Executor executor=Executors.newFixedThreadPool(50);
Executors.newFixedThreadPool(500) では、CPU 使用率が向上したり、タスクを完了する時間が短くなったりすることはありません。ネットワーク トラフィックはありません。すべてがローカル C: ドライブにあります。より多くのスレッドを使用するのに十分な RAM があります。スレッドを 1000 に増やすと、「OutOfMemoryError」が発生します。
より多くのスレッドがより多くの CPU 使用率とより少ない処理時間に変換されないのはなぜですか?
編集:私のハードドライブはSSD 200 GBです。
編集:最終的に問題の場所が見つかりました。各スレッドは、すべてのスレッドで共有されるログ ファイルに結果を書き込みます。アプリを実行する回数が増えるほど、ログ ファイルが大きくなり、ログ ファイルが遅くなり、共有されているため、これが発生します。プロセスが確実に遅くなるため、ログ ファイルへの書き込みを停止すると、すべてのタスクが 10 秒で完了します。