【问题标题】:About fork-join framework关于 fork-join 框架
【发布时间】:2013-05-31 11:55:52
【问题描述】:

作为compute() 中的方法fork();,为什么每次出现compute() 方法时都不会调用另一个并行度?也许有一个布尔标志? 编辑:

重写类 RecursiveTask 的方法compute(): (伪代码)

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 已经被激活?

提前致谢。

【问题讨论】:

  • Unclear...你能写一些伪代码显示你不理解的代码路径和你不理解的内容吗?
  • 确定编辑答案
  • fork() 仅在 array.length &gt;= 100 时被调用。你还需要什么逻辑?
  • 我明白了。但是我只想知道是否有一个标志显示“在第一次调用 fork() 后不再为其他调用更改 CPU。)
  • 不换CPU是什么意思?

标签: java multithreading fork-join


【解决方案1】:

查看 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 线程执行较低级别的任务(在二叉树上较低),从而为您提供所需的并行度

【讨论】:

  • “每次调用 compute() 时,都会通过 fork 在另一个线程(或队列)上放置另一个计算。”你的意思是每个计算都是在一个单独的线程上完成的?
  • fork() 和多核编程有什么关系?
  • fork() 会将任务推送到 fork join 工作队列中,以供其他线程提取。因此,如果您有 5 个线程和 10 个分叉,则 5 个线程将同时执行和处理 10 个分叉(最终)。
  • you mean that every computation is done on a separate thread? 是的,它很可能是,或者可以是当前线程。一切都取决于执行。
  • 那么调用并行 cpu 的位在哪里?如果fork()每次调用fork()时都不应该切换cpu()?非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2012-08-02
  • 1970-01-01
  • 2015-11-04
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多