有人能解释一下Fork/Join是什么吗?
发布于 2010-08-20 04:02:34
Fork Join是一个新的框架,它有一个更容易使用的API,用于并行,分而治之的算法。
假设你有一个长时间运行的任务,在这个例子中,它有一个复杂的算法。您可能希望分叉较大的任务,然后现在处理这两个任务。现在假设这两个任务仍然太大,您可以将每个任务分成两个任务(此时有四个任务)。
您将继续执行此操作,直到每个任务达到可接受的大小,然后调用算法。了解每个任务的调用是并行完成的,这一点很重要。当该任务完成时,它将与与其分叉的另一个任务联接,并合并结果。
这将继续下去,直到所有任务都已加入并返回一个任务。
发布于 2012-02-08 23:43:33
除了前面所说的,fork/join还利用了工作窃取--没有事情做的线程可以从其他仍在忙碌的线程中窃取任务。这里有一个例子,可以帮助你理解如何使用FJ:
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));
}
}发布于 2010-08-20 01:53:48
假设你有一组需要处理的东西。您有许多线程可以获取此集合的子集并处理它们。它们都同时执行此操作( fork部分),然后等待最后一个完成( join部分),然后返回。
https://stackoverflow.com/questions/3524634
复制相似问题