Scala死锁与并行集合

dsg*_*dsg 7 deadlock scala

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

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

  println("A")
  (1 to 1000).par.foreach{ i =>  
    printProgress(i)
  }   
  println("B")
}
Run Code Online (Sandbox Code Playgroud)

(即A打印,但既不打印B也不打印任何Processed ...行.)

但是,以下代码不会导致死锁:

object Test extends Application
{
  println("A")
  (1 to 1000).par.foreach{ i =>  
    println("Processed " + i)
  }   
  println("B")
}
Run Code Online (Sandbox Code Playgroud)

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

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

Did*_*ont 13

可能是因为你扩展了Application,而我无法分辨你的两个例子之间的区别.

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