2011-11-04 37 views
7

为什么以下代码创建死锁:Scala的死锁具有平行集合

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。

+1

'警告:有1个弃用警告'暗示事情不太正确:-) – leedm777

回答

13

可能是因为您扩展了应用程序,而我无法分辨出您的两个示例有什么区别。

使用应用程序,代码在方法main以外的类中初始化。 JVM在这一点上受到严格限制,主要与多线程有关。应用程序不赞成应用程序,它有一些魔术(特性DelayedInit),导致代码在main中执行。所以object Test extends App应该修复它。

+0

这是一个神奇的答案,我会牢记这一点关于我自己的未来工作。 XD – Xorlev