下面(设计的)代码尝试在将来打印一个名字的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上进行了测试.