3

以下の (考案された) コードは、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 をテストしました。

4

1 に答える 1