La cuestión es que se está ejecutando que como un programa independiente, cuyo principal el subproceso finaliza antes de que uno de los subprocesos de trabajo pueda ejecutar el "¡Hola, futuro!" println
. (Los hilos que genera la nueva biblioteca de futuros son hilos de daemon).
También se puede utilizar el objeto Await
(también en scala.concurrent
) que esperar hasta que se complete el futuro f
:
import scala.concurrent._
import scala.concurrent.util._
object Test {
def main(args: Array[String]) {
println("Test print before future")
val s = "Hello"
val f = future {s + " future!"}
f onSuccess {case v => println(v)}
println("Test print after future")
Await.ready(f, Duration.Inf)
}
}
Esto puede imprimir:
Test print before future
Test print after future
Hello future!
O bien, se puede imprimir "Hola ¡futuro!" antes de "Prueba de impresión después del futuro", según el programa del hilo.
Del mismo modo, se puede forzar el hilo principal que esperar hasta f
se completa antes de la última println
de la siguiente manera:
import scala.concurrent._
import scala.concurrent.util._
object Test {
def main(args: Array[String]) {
println("Test print before future")
val s = "Hello"
val f = future {s + " future!"}
f onSuccess {case v => println(v)}
Await.ready(f, Duration.Inf)
println("Test print after future")
}
}
Cuál sería imprimir:
Test print before future
Hello future!
Test print after future
Sin embargo, tenga en cuenta que cuando se utiliza Await
, estás bloqueando. Esto, por supuesto, tiene sentido para asegurarse de que el hilo de la aplicación principal no finaliza, pero en general no debe usarse a menos que sea necesario.
(El objeto Await
es una puerta de escape necesaria para situaciones como estas, pero usarlo en todo el código de la aplicación sin preocuparse por su semántica puede dar como resultado una ejecución más lenta y menos paralela. orden especificado, por ejemplo, hay otras alternativas, como los métodos andThen
y map
en Future
.)
¿Sabes? Pensé en esto porque es exactamente de la misma manera cuando trabajas con goroutines: usas canales para esperar un mensaje enviado por los goroutines antes de cerrar el bloque principal. –
@Heather ¿Es posible esperar más de un futuro? – 66CLSjY