Scala死锁与并行集合

时间:2011-11-04 06:11:50

标签: scala deadlock

为什么以下代码会产生死锁:

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

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

(即A已打印,但BProcessed ...行均未打印。)

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

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

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

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

1 个答案:

答案 0 :(得分:13)

可能是因为你扩展了应用程序,而我无法分辨你的两个例子之间的区别。

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