2017-10-13 2 views
0

Der folgende Code tut, was erwartet wird.Scala Future - Anfänger Abfrage

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext 

object UseFuture extends App 
{ 
    implicit val ec = ExecutionContext.global 
    Future(println { "This should be run in another thread" }) 
    println("Test") 
} 

Aber ich bin nicht in der Lage in den Ausgang der Zukunft zu sehen.

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext 

object UseFuture extends App 
{ 
    implicit val ec = ExecutionContext.global 
    Future(println { "This should be run in another thread" }) 
} 

Eine schnelle Erklärung?

+4

Vielleicht vor der Zukunft fertig Ihr Programm geplant wurde? Versuchen Sie am Ende ein 'Thread.sleep' hinzuzufügen. – Thilo

Antwort

1

@Thilo ist richtig, Ihre App wird schneller beendet, als Future mit der Ausführung beginnt. Grundsätzlich ist mit Await.result keine gute Praxis when you work with Future, so dass dieses Beispiel nur für die Ausbildung Zweck :)

import scala.concurrent.{Await, ExecutionContext, Future} 
import scala.concurrent.duration._ 

object UseFuture extends App 
{ 
    implicit val ec = ExecutionContext.global 
    println(s"Current thread: ${Thread.currentThread().getId}") 
    val future = Future(println { s"Thread id in future: ${Thread.currentThread().getId}. This should be run in another thread" }) 

    Await.result(future, 15.seconds) 
    println("Future has been executed") 
} 
+0

Interessant. Vielen Dank. Ich denke, in Java wird das Programm beendet, nachdem alle Threads fertig sind, außer wir rufen System.exit() auf. Gibt es so etwas hier möglich? –

+0

Future ist ein Platzhalter für den Wert, der noch nicht existiert, println ist eine Nebeneffekt-Funktion, so dass Await immer noch nicht auf das Ergebnis warten muss und das Programm kann schneller enden als die println Zeichenfolge. – Emilia

+1

@RasterR, Scala wird nach JVM-Bytecode kompiliert, daher sollten die Regeln identisch sein. JVM beendet das Programm, wenn der Hauptthread beendet ist und keine anderen Nicht-Daemon-Threads (Benutzerthreads) vorhanden sind. –