首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 7: Fork/Join框架

Java 7: Fork/Join框架
EN

Stack Overflow用户
提问于 2010-08-20 01:47:32
回答 4查看 4.8K关注 0票数 11

有人能解释一下Fork/Join是什么吗?

EN

回答 4

Stack Overflow用户

发布于 2010-08-20 04:02:34

Fork Join是一个新的框架,它有一个更容易使用的API,用于并行,分而治之的算法。

假设你有一个长时间运行的任务,在这个例子中,它有一个复杂的算法。您可能希望分叉较大的任务,然后现在处理这两个任务。现在假设这两个任务仍然太大,您可以将每个任务分成两个任务(此时有四个任务)。

您将继续执行此操作,直到每个任务达到可接受的大小,然后调用算法。了解每个任务的调用是并行完成的,这一点很重要。当该任务完成时,它将与与其分叉的另一个任务联接,并合并结果。

这将继续下去,直到所有任务都已加入并返回一个任务。

票数 8
EN

Stack Overflow用户

发布于 2012-02-08 23:43:33

除了前面所说的,fork/join还利用了工作窃取--没有事情做的线程可以从其他仍在忙碌的线程中窃取任务。这里有一个例子,可以帮助你理解如何使用FJ:

代码语言:javascript
复制
public class SumCounter extends RecursiveTask<Long> { 

  private final Node node; 

  public SumCounter(Node node) { 
    this.node = node; 
  } 

  @Override
  protected Long compute() { 
    long sum = node.getValue();
    List<ValueSumCounter> subTasks = new LinkedList<>(); 

    for(Node child : node.getChildren()) { 
      SumCounter task = new SumCounter(child); 
      task.fork(); // run asynchronously
      subTasks.add(task); 
    }

    for(SumCounter task : subTasks) { 
      sum += task.join(); // wait for the result 
    } 

    return sum;
  }

  public static void main(String[] args) { 
    Node root = getRootNode(); 
    new ForkJoinPool().invoke(new SumCounter(root)); 
  }

}
票数 3
EN

Stack Overflow用户

发布于 2010-08-20 01:53:48

假设你有一组需要处理的东西。您有许多线程可以获取此集合的子集并处理它们。它们都同时执行此操作( fork部分),然后等待最后一个完成( join部分),然后返回。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3524634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档