为什么以下代码会造成死锁:

object Test extends Application
{
  def printProgress(i:Int) =
  {
    println("Processed " + i)
  }

  println("A")
  (1 to 1000).par.foreach{ i =>
    printProgress(i)
  }
  println("B")
}

(即 A 已打印,但 B 和任何 Processed ... 行均未打印。)

但是以下代码不会导致死锁:
object Test extends Application
{
  println("A")
  (1 to 1000).par.foreach{ i =>
    println("Processed " + i)
  }
  println("B")
}

(即一切都被打印出来。)

我正在运行 Scala 版本 2.9.1.final。

最佳答案

可能是因为您扩展了 Application,而我不知道您的两个示例之间有何不同。

使用 Application,代码在方法 main 之外的类初始化中执行。 JVM 在这一点上受到严重限制,特别是与多线程相关。不推荐使用应用程序,而支持应用程序,它具有一些魔法(特性 DelayedInit),可以导致代码在 main 中执行。所以 object Test extends App 应该修复它。

关于Scala 死锁与并行集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8005503/

10-16 01:47