2

シングルスレッドのエグゼキュータ サービスを使用する次のコードがありますが、それを実行すると、マシンの 4 つのコアすべてが使用されます (各コアの平均使用率は約 80% です)。

問題は、なぜこれが起こっているのかということです。ここでは、フィボナッチを実際に見つけることに興味はありません。

public class MainSimpler {
    static int N=35;
    static AtomicInteger result = new AtomicInteger(0), pendingTasks = new AtomicInteger(1);
    static ExecutorService executor;

    public static void main(String[] args) {
        executor = Executors.newSingleThreadExecutor(); 
        long before = System.currentTimeMillis();
        System.out.println("Fibonacci "+N+" is ... ");
        executor.submit(new FibSimpler(N));
        waitToFinish();
        System.out.println(result.get());
        long after = System.currentTimeMillis();        
        System.out.println("Duration: " + (after - before) + " milliseconds\n");
    }

    private static void waitToFinish() {
        while (0 < pendingTasks.get()){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        executor.shutdown();
    }
}



class FibSimpler implements Runnable {
    int N;
    FibSimpler (int n) { N=n; }

    @Override
    public void run() {
        compute();
        MainSimpler.pendingTasks.decrementAndGet();
    }

    void compute() {
        int n = N;
        if (n <= 1) {
            MainSimpler.result.addAndGet(n);
            return;
        }
        MainSimpler.executor.submit(new FibSimpler(n-1));
        MainSimpler.pendingTasks.incrementAndGet();
        N = n-2;
        compute();  // similar to the F/J counterpart
    }
}

これはの別の質問に関連しています。

4

1 に答える 1

4

私のマシンで試してみたところ、合計 35% の CPU 使用率 (4 コア) になりました。プログラムには少なくとも 2 つのスレッド (メイン スレッドとエグゼキュータ スレッド) があることに注意してください。

ただし、N100 に増やすと、フル GC に多くの時間が費やされるため (2 GB のヒープで実行していたため)、CPU 使用率は 90% 以上になります。

したがって、単一のスレッドがビジー状態になり、タスクが蓄積され始め、実行されるのを待っているように見えます。

次の JVM パラメータを使用してコードを実行してみてください。-XX:+PrintGC

私のマシンの出力は次のようになります。

[GC 511999K-> 465632K(1962688K)、1.0286778秒]
[GC 977632K-> 922984K(1962688K)、1.1999209秒]
[GC 1434984K ] [GC 1434984K]
1407984K 9.8320408秒]
[フルGC 1885358K-> 1822040K(1962688K)、7.5170472秒]
[フルGC 1877375K-> 1870974K(1962688K)、7.66635945秒196774k -
1874K(18774K)
>1877272K(1962688K)、7.8381579 秒]
[フル GC 1877372K->1877357K(1962688K)、8.6095022 秒]

于 2012-11-30T12:51:44.860 に答える