Первый блок равен примерно так:
def code(): Int = {
Thread.sleep(Random.nextInt(500))
42
}
val f = Future(code)
Блок действует как анонимная функция, но он не требует объявления функции, это просто синтаксический сахар. Таким образом, в будущем f
охотно оценивает содержимое блока асинхронно, начиная с точки объявления. Т.е. если случайное число выдаст число n
, равное 0 < n < 500
, выполнение в будущем будет приостановлено на n
миллисекунд, а затем возобновлено, а число 42 будет возвращено и установлено как результат Future.
Поскольку фьючерсы не являются блокирующими, а контекст исполнения вашего будущего работает над вашим будущим f
, основной поток выполнит строку
println("2- before onComplete")
, и вы увидите эту строку в приставка. Затем второй блок использует сопоставление с образцом для создания функции, которая действует от Try[Int]
до Unit, как это определено для конструкторов Success
и Failure
Try
, это эквивалентно:
f.onComplete { ttry =>
ttry match {
case Success(value) => println(s"Got the callback, meaning = $value")
case Failure(e) => e.printStackTrace
}
}
Обратите внимание, что вы должны ждать своего будущего до завершения приложения, чтобы обеспечить выполнение блока onComplete
.