2016-04-09 9 views
1

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?

Antwort

3

Da der Thread, der das Ereignis registriert, der Hauptthread ist, nicht der Thread, der die Zukunft ausführt. In diesem Fall lief es nicht auf dem Thread-Haupt, sondern auf dem Thread ForkJoinPool-1-worker-13. Die OnComplete und die Zukunft können auf demselben Thread ausgeführt werden, da das OnComplete erst nach dem Ende der Zukunft beginnt. Die Dokumentation besagt lediglich, dass sie auf einem anderen Thread als dem Hauptthread ausgeführt werden.

Verwandte Themen