以下の (考案された) コードは、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
}
ただし、 を実行RunMe
すると、 を評価しようとしてハングするだけparam
です。パラメータを値で受け取るように変更printIt
すると、アプリケーションは期待どおりに戻ります。あるいは、printIt
単に値を出力して同期的に (同じスレッドで) 返すように変更しても、うまくいくようです。
ここで正確に何が起こっているのですか?これは、Go オブジェクトがまだ完全に構築されていないことに何らかの形で関連しているので、str
フィールドを印刷しようとしているスレッドにはまだ表示されていませんか? ここで予想される動作をぶら下げていますか?
Java 1.7 で、Mac OS Mavericks と Windows 7 の両方で Scala 2.10.3 をテストしました。