我有下面的代碼,它使用單線程執行程序服務,但運行它使用我的機器上的所有4個核心(每個核心的平均使用率約爲80%)。爲什麼SingleThreaded Executor服務使用4個內核?
問題是爲什麼會發生這種情況? 我真的沒有興趣在這裏找斐波那契!
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
}
}
這與另一個問題mine有關。
你能發佈簡短而*完整*程序,演示了此問題?我們需要看到FibSampler。 –
它在代碼中。向下滾動! :) – Mahdi
就核心利用率而言,它並不意味着您的代碼正在利用所有核心。操作系統也可以利用這些內核。所以你的問題是無效的。就你的其他問題而言,僅僅使用線程不會提供性能,你必須對它進行優化,以便在並行環境中得到最佳使用。算法也應該是可以並行執行的。 –