2015-07-12 18 views

risposta

23

L'inconveniente principale di java.util.concurrent.Future è il fatto che non è possibile ottenere il valore senza bloccare.

Infatti, l'unico modo per recuperare un valore è il metodo get, che (quoting from the docs)

Waits se necessario, per il calcolo di compilare, quindi recupera il suo risultato.

Con scala.concurrent.Future si ottiene invece un vero e proprio calcolo non bloccante, come è possibile allegare callback per il completamento (successo/insuccesso) o semplicemente mappa su di esso e catene multiple Futures insieme in modo monadica.

Per farla breve, scala's Future consente il calcolo asincrono senza bloccare più thread del necessario.

+0

Forse sarebbe più preciso dire che scala ha un api più conveniente per interagire con Futures e callback in sospeso. Non sono sicuro di come sia il confronto con Java8 CompletableFuture, anche se quello non viene restituito dagli esecutori standard. – tkruse

2

Java Future: Entrambi rappresentano risultato di un calcolo asincrono, ma di Java Future richiede che si accede al risultato tramite un blocco ottenere method.Although è possibile chiamare isDone per scoprire se un Java futuro ha completato prima di chiamare get, evitando così qualsiasi blocco, è necessario attendere il completamento di Java Future prima di procedere con qualsiasi calcolo che utilizza il risultato.

Scala Future: è possibile specificare le trasformazioni su uno Scala futurose abbia completato o risultati not.Each trasformazione in una nuova futuro rappresenta il risultato asincrona dell'originale Future trasformato dalla funzione. Ciò consente di descrivere i calcoli asincroni come una serie di trasformazioni.

Il futuro di Scala spesso elimina, la necessità di ragionare su dati e blocchi condivisi. Quando invochi un metodo Scala, esegue un calcolo "mentre aspetti" e restituisce un risultato. Se quel risultato è un futuro, il futuro rappresenta un altro calcolo da eseguire in modo asincrono spesso da un thread completamente diverso.

Esempio: Invece di bloccare, quindi continuare con un altro calcolo, è possibile mappare il prossimo calcolo sul futuro.

Dopo futuro completerà dopo dieci secondi:

val fut = Future { Thread.sleep(10000);21+21} 

Mapping questo futuro con una funzione che incrementa di uno produrrà un altro futuro.

val result = fut.map(x=>x+1) 
Problemi correlati