シングルスレッドのエグゼキュータ サービスを使用する次のコードがありますが、それを実行すると、マシンの 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
    }
}
これは私の別の質問に関連しています。