問題は、あなたが実行していることであることを主なスタンドアロンのプログラムとして、スレッドは、ワーカースレッドの1つが "Hello future!"を実行する前に終了しています。 println
。 (新しい先物ライブラリが生成するスレッドはデーモンスレッドです)。それはこんにちは」印刷することができ、
Test print before future
Test print after future
Hello future!
をまたは:
import scala.concurrent._
import scala.concurrent.util._
object Test {
def main(args: Array[String]) {
println("Test print before future")
val s = "Hello"
val f = future {s + " future!"}
f onSuccess {case v => println(v)}
println("Test print after future")
Await.ready(f, Duration.Inf)
}
}
これは、印刷することができます。
はまた、将来f
が完了するまで待機する(もscala.concurrent
中)Await
オブジェクトを使用することができます未来!"スレッドのスケジュールに応じて、「将来に印刷を試してください」の前に
同様に、あなたは次のようf
が最後println
前に完了するまで待つメインスレッドを強制することができます。
印刷し
import scala.concurrent._
import scala.concurrent.util._
object Test {
def main(args: Array[String]) {
println("Test print before future")
val s = "Hello"
val f = future {s + " future!"}
f onSuccess {case v => println(v)}
Await.ready(f, Duration.Inf)
println("Test print after future")
}
}
:
Test print before future
Hello future!
Test print after future
しかし、あなたが使用している場合ということに注意してくださいAwait
、ブロックしています。これはもちろん、メインのアプリケーションスレッドが終了しないことを確認するのに理にかなっていますが、通常は別途必要な場合を除いては使用しないでください。
(これらのような状況では、オブジェクトは必要なエスケープハッチですが、セマンティクスを気にせずにアプリケーションコード全体で使用すると、パラレル実行が遅くなる可能性があります。例えば、Future
にandThen
とmap
のメソッドのような他の選択肢があります。)
ご存知ですか?私は、あなたがgoroutinesを扱っているときに、これがまさに同じように起こっていると考えました。メインブロックを閉じる前に、チャンネルを使ってゴルーチンから送られたメッセージを待っていました。 –
@Heather複数の未来を待つことは可能でしょうか? – 66CLSjY