У меня есть следующий код, который использует однопоточную службу исполнителя, но при его запуске используются все 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
}
}
Это связано с другим вопросом мой .