Das Problem ist, dass Sie ausführen, dass als eigenständiges Programm, dessen Haupt Thread wird beendet, bevor einer der Worker-Threads die "Hallo Zukunft!" ausführen kann println
. (Die Threads, die die neue Futures-Bibliothek erzeugt, sind Daemon-Threads).
Sie können auch verwenden, um die Await
Objekt (auch in scala.concurrent
) zu warten, bis die Zukunft f
abgeschlossen ist:
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)
}
}
Dieser Druck kann:
Test print before future
Test print after future
Hello future!
Oder es kann drucken „Hallo Zukunft!" vor "Test print after future" abhängig vom Thread-Zeitplan.
Ebenso können Sie den Haupt-Thread zwingen, zu warten, bis f
vor dem letzten println
wird wie folgt ergänzt:
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")
}
}
Welche drucken würde:
Test print before future
Hello future!
Test print after future
Beachten Sie jedoch, dass, wenn Sie verwenden Await
, Sie blockieren. Dies macht natürlich Sinn, um sicherzustellen, dass Ihr Hauptanwendungs-Thread nicht beendet wird, aber im Allgemeinen sollte nicht verwendet werden, es sei denn, es ist notwendig. Das Objekt ist eine notwendige Escape-Luke für Situationen wie diese, aber die Verwendung des gesamten Anwendungscodes ohne Rücksicht auf seine Semantik kann zu einer langsameren, weniger parallelen Ausführung führen Wenn Sie sicherstellen müssen, dass Callbacks in einigen Fällen ausgeführt werden B. die Reihenfolge andThen
und map
auf Future
.)
Sie wissen? Ich dachte darüber nach, weil es genau so ist, wenn man mit Goroutines zu tun hat: Man benutzt Kanäle, um auf eine Nachricht zu warten, die von den Goroutines gesendet wird, bevor der Hauptblock geschlossen wird. –
@Heather Kann man auf mehr als eine Zukunft warten? – 66CLSjY