0

作为其中的方法fork();compute()为什么每次方法compute()发生时都不会被称为另一个并行度?也许有一个布尔标志? 编辑:

覆盖compute()类 RecursiveTask 的方法:(伪代码)

if {array.length<100)
do it
else
divide array by 2;
fork();
int righta = rightArray.compute();
int lefta =(Integer)leftArray.join();
return righta +lefta;

所以基本上这是compute()递归调用的方法,当fork()发生时,它可以使用并行性并使用另一个核心处理该任务。但是,在递归fork()调用该方法的所有时间都应该调用递归。所以在现实中它不会发生(没有意义)。是不是因为一个布尔标志表明 fork 已经被激活?

提前致谢。

4

1 回答 1

2

看看 API

 class Fibonacci extends RecursiveTask<Integer> {
   final int n;
   Fibonacci(int n) { this.n = n; }
   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();
   }
 }

每次compute()调用它都会通过 fork 在另一个线程(或队列)上放置另一个计算。连续计算分叉,直到没有更多n可处理。此时,计算将等待“右侧”完成,同时f1.join()等待“左侧”完成。

每当join被调用时,它实际上会使joining线程执行较低级别的任务(在二叉树上较低),为您提供所需的并行度

于 2013-05-31T15:13:30.073 回答