Pergunta

Usando Scala-IDE 3.0.3 (baseado em Scala 2.10.4), o código a seguir é concluído corretamente exibindo os primeiros 10 valores do cálculo List de um futuro, bem como do Future completedmensagem:

import scala.concurrent._
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import ExecutionContext.Implicits.global

object FutureNonBlocking extends App {

    val f1: Future[List[Int]] = future {
        val t = List.range(1, 50).filter(_ % 2 == 0)
        println("Done")
        t
    }

    f1.onComplete {
        case Success(value) => println(value.take(10))
        case Failure(e) => println("Something bad happened")
    }

    Await.complete(f1, 30 seconds)
}

No entanto, alterando o intervalo List.range(1, 50) para List.range(1, 5000) não exibe nada e (o Failure não é acionado).Logicamente, parece estar relacionado a um problema de memória, mas não entendo o que está acontecendo aí.

Ainda mais estranho, executar esse código em um REPL não causa o problema.O que estou perdendo aí?

Foi útil?

Solução

Acontece que a coisa toda não é um problema com o gerenciamento de memória no Futures mas está relacionado à maneira como o Eclipse lida com a saída do console para programas simultâneos.

Adicionando Thread.sleep(1000) ao final do programa deixe o Eclipse mostrar toda a saída do console, resolvendo o problema.

Muito obrigado @jilen pelo seu comentário muito útil!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top