下面是两个代码片段,一个是顺序代码,另一个是并行代码:
public<T> void sequentialRecursive(List<Node<T>> nodes, Collection<T> results)
{
for(Node<T> n: nodes) {
results.add(n.compute());
sequentialRecursive(n.getChildren(), results);
}
}
public<T> void parallelRecursive(final Executor exec, List<Node<T>> nodes, final Collection<T> results) {
for(final Node<T> n : nodes){
exec.execute(new Runnable(){
public void run()
{
results.add(n.compute());
}
});
parallelRecursive(exec, n.getChildren(), results);
}
}
我想知道以上两个函数是否产生相同的结果?是否可以得到以下结果? SequentialRecursive的结果是:[1,2,3,4,5],ParallelRecursive的结果是:[1,3,2,5,4]。
答案 0 :(得分:1)
第二个函数将以不可预测的顺序获得结果,因为它创建的每个任务都会计算一个节点的答案,而执行程序通过将它们提供给不同的线程来处理这些任务。没有人知道结果将添加到什么顺序,这取决于调度程序何时选择哪个线程。
可靠地获得两者的相同结果的一种方法是使用SingleThreadExecutor作为第二个例子。