Использование фьючерсов и 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)
}
}
Ответы
Ответ 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() в свой код.