小编Sia*_*iam的帖子

为什么scala会挂起在Future中评估一个名字参数?

下面(设计的)代码尝试在将来打印一个名字的String参数,并在打印完成时返回.

import scala.concurrent._
import concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

class PrintValueAndWait {
  def printIt(param: => String): Unit = {
    val printingComplete = future { 
      println(param);  // why does this hang?
    }
    Await.result(printingComplete, Duration.Inf)
  }
}

object Go {
  val str = "Rabbits"

  new PrintValueAndWait().printIt(str)
}

object RunMe extends App {
  Go
}
Run Code Online (Sandbox Code Playgroud)

但是,在运行时RunMe,它只是在尝试评估时挂起param.更改printIt为接受其参数的值会使应用程序按预期返回.或者,更改printIt为简单地打印值并同步返回(在同一个线程中)似乎也可以正常工作.

这到底发生了什么?这是否与Go对象有关尚未完全构造,因此该str字段尚未显示给尝试打印它的线程?挂在这里的预期行为?

我已经在Java 1.7上使用Scala 2.10.3在Mac OS Mavericks和Windows 7上进行了测试.

multithreading scala future object pass-by-name

3
推荐指数
1
解决办法
446
查看次数

标签 统计

future ×1

multithreading ×1

object ×1

pass-by-name ×1

scala ×1