static class ComputeFibonacciTask extends RecursiveTask<Long> {
private final long n;
public ComputeFibonacciTask(long n) {
this.n = n;
}
protected Long compute() {
if (n <= 1) {
return n;
} else {
RecursiveTask<Long> otherTask = new ComputeFibonacciTask(n - 1);
otherTask.fork();
Long right = new ComputeFibonacciTask(n - 2).compute();
return right + otherTask.join();
}
}
}
直接
1000
使用默认的ForkJoinPool
构造方法, 可以看到由于错误的理解, 分治导致出现 2^1000 - 2 个实例还有一点注意的是: 默认 pool 的大小是
核心-1
, 并且是并行的^2直接爆炸 💥
某一刻的 profile
jprofile active code: https://zhile.io/2022/02/22/jprofiler-license.html
解决方法:
不要用 forkJoinPool 来解决非分治问题^1