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,CPU 使用率会上升到 90+%,因为大量时间都花在了 Full GC 上(而且我运行的是 2GB 堆)。

所以看起来你的单线程太忙了,任务开始累积,等待被执行。

您可以尝试使用以下 JVM 参数运行代码:-XX:+PrintGC

我机器上的输出如下所示:

[GC 511999K-> 465632K(1962688K),1.0286778秒]
[GC 977632K-> 922984K(1962688K),1.1999209秒]
[GC 1434984K-> 1407984K(1962688K),1.2421900秒]
[全GC 1407984K-> 1373358K(1962688K), 9.8320408秒]
[全GC 1885358K-> 1822040K(1962688K),7.5170472秒]
[全GC 1877375K-> 1870974K(1962688K),7.6635945秒]
[全GC 1877374K-> 1876550K(1962688K),7.6705722秒]
[全GC 1877374K- >1877272K(1962688K), 7.8381579 秒]
[完整 GC 1877372K->1877357K(1962688K), 8.6095022 秒]

于 2012-11-30T12:51:44.860 回答