In Learning Akka von Jason Goodwin lese ich:Scala-Futures - welcher Thread führt onComplete aus?
val future = getUsernameFromDatabaseAsync(userId)
future.onComplete(username =>
//executed somewhere else
println(username)
)
Es ist wichtig, wieder-die markieren print-Anweisung wird nicht auf dem Thread ausgeführt, der das Ereignis registriert. Es wird irgendwo anders laufen, in einem anderen Thread über den ExecutionContext. Futures werden immer mit ExecutionContext erstellt, sodass Sie auswählen können, wo sie ausgeführt werden sollen.
Und ich aus Neugier wollte es selbst überprüfen, so bereitete ich einen Ausschnitt:
val myFuture = Future {
println("in future: " + Thread.currentThread().getName())
Thread.sleep(1000)
}
myFuture.onComplete {
case _ ⇒ println("in onComplete: " + Thread.currentThread().getName())
}
println("main: " + Thread.currentThread().getName())
Await.result(myFuture, 10 seconds)
ich die folgende Ausgabe Bitte Code jedes Mal, wenn ich laufen zu bekommen.
main: main
in future: ForkJoinPool-1-worker-13
in onComplete: ForkJoinPool-1-worker-13
Zukunft und onComplete auf dem gleichen Thread ausgeführt, aber das Buch sagt, dass onComplete könnte den Rückruf auf einem anderen Thread ausführen. Wie erklärt man es?