我将使用一个示例来利用多核CPU体系结构,该示例计算0到n的所有整数之和
Integer.MAX_VALUE
. 我的阈值是5000000个整数。所以我递归地拆分它,直到它达到阈值。然后当它达到阈值时,我计算总和。最后,将所有总和累加在一起,以计算最终结果。这个问题本质上是递归的,很好地符合Fork/join框架。但当我运行它时,我会出错。有时是Stackoverflow错误。其他时候是这样的。
Exception in thread "ForkJoinPool.commonPool-worker-7" java.lang.NoClassDefFoundError: Could not initialize class java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1198)
这是我的代码:
public class ParallelSum extends RecursiveTask<Long> {
private static final int THRESHOLD = 5000000;
private final int start;
private final int end;
public ParallelSum(int start, int end) {
super();
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
// System.out.println("Start: " + start + " End: " + end);
if (end - start > THRESHOLD) {
return ForkJoinTask.invokeAll(createSubtasks()).stream().mapToLong(ForkJoinTask::join).sum();
}
return LongStream.rangeClosed(start, end).sum();
}
private Collection<RecursiveTask<Long>> createSubtasks() {
final List<RecursiveTask<Long>> dividedTasks = new ArrayList<>();
dividedTasks.add(new ParallelSum(start, end / 2));
dividedTasks.add(new ParallelSum(end / 2 + 1, end));
return dividedTasks;
}
}
主要的方法是这样的,
public class ParallelSumTest {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
final long sum = new ParallelSum(0, Integer.MAX_VALUE).compute();
long endTime = System.currentTimeMillis();
final long elapsedTime = endTime - startTime;
System.out.println(sum + " was computed in " + elapsedTime + " milliseconds.");
}
}
这里缺少什么?我做错了什么?非常感谢您的帮助。