我有使用RecursiveTask的febunacci算法代码,我在
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html
代码1
public class Fibonacci extends RecursiveTask<Integer> {
final int n;
public Fibonacci (int n) { this.n = n; }
public Integer compute() {
if (n <= 1)
return n;
Fibonacci f1 = new Fibonacci(n - 1);
f1.fork();
Fibonacci f2 = new Fibonacci(n - 2);
return f2.compute() + f1.join();
}
public static void main(String args[]){
ForkJoinPool fjpool = new ForkJoinPool();
RecursiveTask task = new Fibonacci(30);
long startTime1=System.currentTimeMillis();;
Integer O=(Integer) fjpool.invoke(task);
long endTime1 = System.currentTimeMillis();
long duration1 = (endTime1 - startTime1);
System.out.println(duration1);
}}这段代码在83ms中执行,我修改了它。
代码2
public class Fibonacci extends RecursiveTask<Integer> {
final int n;
public Fibonacci (int n) { this.n = n; }
public Integer compute() {
if (n <= 1)
return n;
Fibonacci f1 = new Fibonacci(n - 1);
Fibonacci f2 = new Fibonacci(n - 2);
return f2.compute() + f1.compute();
}
public static void main(String args[]){
ForkJoinPool fjpool = new ForkJoinPool();
RecursiveTask task = new Fibonacci(30);
long startTime1=System.currentTimeMillis();;
Integer O=(Integer) fjpool.invoke(task);
long endTime1 = System.currentTimeMillis();
long duration1 = (endTime1 - startTime1);
System.out.println(duration1);
}}现在,在20 me中执行的这段代码可以有人解释为什么第二步速度更快,我阅读了文档,它说叉异步执行,然后运行慢于使用计算。
发布于 2018-01-29 22:30:46
第一种解决方案可能执行得很差,因为最小的子任务太小,不值得拆分。
RecursiveTask task = new Fibonacci(30);
相反,就像几乎所有的叉/连接应用程序的情况一样,您可以选择一些最小粒度大小(例如这里的30 ),对于这些粒度大小,您总是顺序地解决而不是细分。
记住,当涉及到要并行化的更大的数据集时,Fork/Join框架是巨大的。
来源
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html
发布于 2021-01-13 09:22:51
因为+compute()不使用池中的新线程,并且它不是在池托管线程中运行的。当池调用了许多RecursiveTasks时,您将看到+join()的并行性好处。然后,如果计算方法中存在等待或阻塞,则它的线程将被其他任务使用。所以会有更少的线程。
https://stackoverflow.com/questions/48510959
复制相似问题