2013-05-03 3 views
3

Я пытаюсь запустить следующий будущий базовый кодScala - фьючерсы не работают

future { println("ssss")} onSuccess{ case _ => println("succ")} 

Однако, когда я бег основного метода, ничего на консоль не выводится, и система выходит практически мгновенно. Я использую неявный ExecutionContext. Любые намеки?

Этот код:

val f = future(Await.ready(Promise().future, d.timeLeft)) 

    f.onSuccess { 
    case _ => println("hee") 
    } 

также выходит сразу ....

+2

возможно дубликат [Возможная ошибка в Scala 2.10 будущего] (http://stackoverflow.com/ вопросы/10565475/possible-bug-in-scala-2-10-future) – Dylan

ответ

11

Фьючерсы выполняются на выделенном пуле потоков. Если ваша основная программа не ждет будущего, она немедленно выйдет, и будущее не будет иметь возможности выполнить. Что вы можете сделать здесь, чтобы использовать Await в основной программе, чтобы блокировать основной поток, пока будущее не выполняет:

def main(args: Array[String]) { 
    val fut = future { println("ssss")} 
    fut onSuccess{ case _ => println("succ")} 
    Await.result(fut) 
} 
+0

Мне бы в основном понравилось поведение блокировки Java future.get() в Scala, это достигается с помощью Await? – Bober02

+0

Да, это будет ждать результата и вернуть его (или реконструировать исключение, если будущее не сработало). –

+0

Итак, в чем смысл OnSuccess, если он работает в отдельном потоке и не передает результат, пока мы действительно не попросим результатов? Мы могли бы просто попросить результаты по основному потоку, а затем выполнить sth на основе успеха/неудачи, правильно? – Bober02

Смежные вопросы