以下两个代码是否得到相同的结果?

时间:2014-07-24 13:46:36

标签: java concurrency

下面是两个代码片段,一个是顺序代码,另一个是并行代码:

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]。

1 个答案:

答案 0 :(得分:1)

第二个函数将以不可预测的顺序获得结果,因为它创建的每个任务都会计算一个节点的答案,而执行程序通过将它们提供给不同的线程来处理这些任务。没有人知道结果将添加到什么顺序,这取决于调度程序何时选择哪个线程。

可靠地获得两者的相同结果的一种方法是使用SingleThreadExecutor作为第二个例子。