我有以下使用单线程执行程序服务的代码,但运行它会使用我机器上的所有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
}
}
这与mine的另一个问题有关。
答案 0 :(得分:4)
刚刚在我的机器上试过,我获得了35%的总CPU使用率(4个核心)。请注意,程序中至少有2个线程(主线程和执行程序线程)。
但是,如果我将N
增加到100,则CPU使用率会上升到90 +%,因为在Full GCs中花费了大量时间(并且我使用2GB堆运行)。
所以看起来你的单线程太忙了,任务开始累积,等待执行。
您可以尝试使用以下JVM参数运行代码:-XX:+PrintGC
我机器上的输出如下:
[GC 511999K-> 465632K(1962688K),1.0286778秒]
[GC 977632K-&gt; 922984K(1962688K),1.1999209 secs]
[GC 1434984K-> 1407984K(1962688K),1.2421900秒]
[Full GC 1407984K-&gt; 1373358K(1962688K),9.8320408 secs]
[Full GC 1885358K-&gt; 1822040K(1962688K),7.5170472 secs]
[Full GC 1877375K-&gt; 1870974K(1962688K),7.6635945 secs]
[Full GC 1877374K-&gt; 1876550K(1962688K),7.6705722 secs]
[Full GC 1877374K-&gt; 1877272K(1962688K),7.8381579 secs]
[Full GC 1877372K-&gt; 1877357K(1962688K),8.6095022 secs]