Pregunta

Al utilizar Scala-IDE 3.0.3 (basado en Scala 2.10.4), el siguiente código se completa correctamente mostrando los primeros 10 valores del cálculo List desde un futuro así como el Future completedmensaje:

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)
}

Sin embargo, cambiando el rango List.range(1, 50) a List.range(1, 5000) no muestra nada y (el Failure no se activa).Lógicamente parece que está relacionado con un problema de memoria pero no entiendo qué pasa ahí.

Aún más extraño, ejecutar este código en un REPL no causa el problema.¿Qué me falta ahí?

¿Fue útil?

Solución

Resulta que todo el asunto no es un problema con la administración de la memoria en Futures, pero está relacionado con la forma en que Eclipse maneja la salida de la consola para programas concurrentes.

Agregar Thread.sleep(1000) al final del programa Permita que Eclipse muestre toda la salida de la consola, resolviendo el problema.

¡Muchas gracias a @jilen por su comentario muy útil!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top