【问题标题】:Does the following two code get the same result?以下两个代码是否得到相同的结果?
【发布时间】:2014-07-24 13:46:35
【问题描述】:

下面是两个sn-p代码,一个是顺序的,一个是并行的:

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

【问题讨论】:

  • 你试过实际运行它吗? :)
  • 当你尝试执行这两种方法时的输出是什么?
  • 抱歉没试过,是书上的例子。我对此感到困惑。
  • 我能说的是——第二个非常效率低下
  • 如果不带来效率,那么并行又有什么意义呢?

标签: java concurrency


【解决方案1】:

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

一种可靠地获得相同结果的方法是在第二个示例中使用 SingleThreadExecutor。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多