1

たとえば、Java Concurrency in Practice で、「スレッドが 1 つしかないプログラムは、一度に多くても 1 つのプロセッサで実行できる」と読んだことがあります。

ただし、2.5 GHz Intel Core 2 Duo Macbook Pro でシングルスレッドの Java クラスを実行すると、両方のコアで CPU 使用率がほぼ 0% から約 60% に上昇することが (Activity Monitor で) わかります。

Mac OS は何らかの方法でスレッドをあるコアから別のコアに切り替えていますか? もしそうなら、それはなぜですか?

ありがとう!これがコードです..

public class PrimeCalculator {

    public static void findPrimes (int start, int end){
        int countPrimes = 0;
        for (int i=start; i<end; i++){
            if (i % 1000000 == 0){
                System.out.println("Did a million..");
            }
            boolean found = true;
            for (int check = 2; check <= Math.sqrt(i); check++){
                if (i % check == 0){
                    found = false;
                    break;
                }
            }
            if (found == true){
                //System.out.println(i);
                countPrimes++;
            }
        }
        System.out.println("I counted "+countPrimes+" primes");
    }

    public static void main(String[] args){
        findPrimes(0,100000000);
    }
}
4

2 に答える 2

2

Java スレッドは、カーネル スレッドに 1 対 1 でマップされる場合がありますが、そうである必要はありません。OS は、スレッドをあるコアから別のコアに自由にスワップできます。理由はありません。また、1 つのスレッドしか使用しない場合でも、JVM は複数のコアを使用できます。

たぶん、ここでいくつかの詳細情報を見つけることができます: 単一のスレッド化されたプロセスが複数のプロセッサ/コアで実行されるのはなぜですか?

于 2013-04-14T08:45:51.257 に答える
1

jstack コマンドを使用して、スレッドの動作を確認できます。Java はバックグラウンドで多くのスレッドも作成することを忘れないでください。主な例は、GC スレッド、ファイナライザー、シグナル ディスパッチャーなどです。

私の Mac では、約 8 つのスレッドが表示されています。マイレージは異なる場合があります。OS と JDK の実装では、スレッドを好きな場所に自由にスケジュールできます。

于 2013-04-14T08:47:40.570 に答える