web-dev-qa-db-ja.com

futuresとThread.sleepを使用する

このscalaコードを実行することにより、コンソールに出力がありません。何が起こっているのか本当にわかりません)

Console.println("Console.println OK!") =>を削除すると、すべてうまくいくようです。

Thread.sleep(2000) =>を削除すると、すべてうまくいくようです。

これについて何かアイデアはありますか?どうもありがとうございました!

クレメント

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scala.concurrent.{Await, Future}
import scala.language.postfixOps

object ScalaFuture {

  def main(args: Array[String]) {

    val f: Future[String] = Future {
      Thread.sleep(2000)
      "future value"
    }

    f.onSuccess {
      case s => {
        Console.println("Console.println OK!")
        System.out.println("System.out.println OK!")
      }
    }

    Await.ready(f, 60 seconds)
  }

}
15
ctamisier

待機は、2秒後に行われるfutureの完了を待機していますが、別のスレッド(futureと同様)で実行されるonSuccessハンドラーを待機しませんが、Await.ready(f, 60 seconds)の後、何かを印刷するよりも早くプロセスが終了します。正しく処理するには-onCompleteの新しいフューチャーを作成します:

val f: Future[String] = Future {
  Thread.sleep(2000)
  "future value"
}

val f2 = f map { s => 
    println("OK!")
    println("OK!")    
}

Await.ready(f2, 60 seconds)
println("exit")

Await.ready(f, ...)の結果:

exit
OK!
OK!

Await.ready(f2, ...)の結果:

OK!
OK!
exit
26
dk14