Подтвердить что ты не робот

Использование фьючерсов и 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)
  }

}
4b9b3361

Ответ 1

Ожидание вашего ожидания ожидает завершения, которое выполняется через 2 секунды, но оно не ждет обработчика 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

Ответ 2

Просто поместите readLine() в свой код.