3

これは、Java スレッドが異なるコアで実行されるようにする方法 に表示されている質問と同様の質問です。しかし、Java ではその点で多くの進歩があった可能性があり、また、その質問で探している答えを見つけることができませんでした。

マルチスレッドプログラムを書き終えました。プログラムは複数のスレッドを生成しますが、複数のコアを使用しているようには見えません。プログラム高速です (高速化するものを並列化しています) が、「top」を実行して判断すると、利用可能なすべてのコアを確実に使用しているわけではありません。

何か案は?それは予想される動作ですか?

一般的なコード構造は次のとおりです。

   for (some values in i)
   {
        start a thread of instantiated as MyThread(i)
        (this thread uses heavily ConcurrentHashMap and arrays and basic arithmetic, no IO)
        add the thread to a list T
   }

   foreach (thread in T)
   {
        do thread.join()
   }
4

2 に答える 2

4

1 つの CPU のほぼ 100% である場合は、実際に

  • 1 つのコア スレッドがすべての作業を行っており、他のスレッドはそれほど多くの作業を行っていません。
  • ロックしているリソースが 1 つあり、実行できるスレッドは 1 つだけです。

約 1 つの CPU を使用している場合、IO (ネットワークおよび/またはディスク) などを待機しているため、これが CPU のすべての作業であることを意味する可能性があります。

VisualVM のスレッドの状態を確認することをお勧めします。どのスレッドが実行されているかを特定し、それらの動作パターンの理想を示すのに役立ちます。また、CPU プロファイラーを使用してボトルネックを見つけることをお勧めします。

于 2012-09-21T17:05:10.047 に答える
1

Katherine Sierra による SCJP の本で、JVM が基礎となる OS にすべての Java スレッドに対して新しい OS スレッドを作成するように要求することを読んだと思います。

したがって、使用可能な CPU 間で Java (およびその他の種類の) スレッドのバランスを取る方法を決定するのは、基盤となるオペレーティング システム次第です。

于 2012-09-21T17:17:36.247 に答える