为什么以下代码会造成死锁:
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/