web-dev-qa-db-fra.com

Utilisation de futures et de Thread.sleep

En exécutant ce scala, je n'ai aucune sortie dans la console. (Je ne comprends pas vraiment ce qui se passe)

Si je supprime Console.println("Console.println OK!") => tout va bien.

Si je supprime Thread.sleep(2000) => tout va bien.

Avez-vous des idées à ce sujet? Merci beaucoup!

Clément

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

Votre attente attend la fin de l'avenir, ce qui se fait après 2 secondes, mais il n'attend pas le gestionnaire onSuccess, qui s'exécute dans un autre thread (similaire à future), mais après Await.ready(f, 60 seconds), donc le processus se termine plus tôt que vous n'imprimez quelque chose. Pour le traiter correctement - créez un nouvel avenir pour 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")

Résultats pour Await.ready(f, ...):

exit
OK!
OK!

Résultats pour Await.ready(f2, ...):

OK!
OK!
exit
26
dk14