2011-11-04 81 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