Esiste un caso per l'implementazione di una richiamata se viene restituito un futuro?

3

Se ho una funzione che restituisce un futuro, c'è qualche ragione per includere anche una richiamata in cui il callback è chiamato semplicemente giusto prima che il futuro venga completato?

L'unico vantaggio che posso pensare sarebbe quello di garantire che un'azione venga eseguita prima di qualsiasi attività in sospeso sul futuro e che l'azione sia garantita che avvenga all'interno della stessa discussione del futuro destinatario.

Esistono casi d'uso o applicazioni pratiche per questo?

    
posta Zhro 02.05.2016 - 00:04
fonte

1 risposta

4

La libreria Guava ha il concetto di ListenableFuture e un SettableFuture .

Un ListenableFuture ti consente di registrare i callback da eseguire una volta completato il calcolo, o se il il calcolo è già completo, immediatamente. Questa semplice aggiunta consente di supportare in modo efficiente molte operazioni che l'interfaccia di base Future non supporta.

Poiché l'interfaccia Runnable non fornisce l'accesso diretto al risultato Future , gli utenti che desiderano tale accesso potrebbero preferire Futures.addCallback . Un FutureCallback<V> implementa due metodi:

  • onSuccess(V) , l'azione da eseguire se il futuro ha successo, in base al suo risultato
  • onFailure(Throwable) , l'azione da eseguire se il futuro fallisce, in base all'errore

Il motivo più importante per usare ListenableFuture è che diventa possibile avere catene complesse di operazioni asincrone.

Quando diverse operazioni dovrebbero iniziare non appena inizia un'altra operazione ("fan-out"), ListenableFuture funziona correttamente: attiva tutti i callback richiesti. Con un po 'più di lavoro, possiamo "fan-in" o attivare un ListenableFuture per essere calcolati non appena diversi altri futures sono finiti: vedi l'implementazione di Futures.allAsList per un esempio.

In .NET, questi concetti sono implementati usando Task , TaskCompletionSource e ContinueWith .

    
risposta data 02.05.2016 - 02:17
fonte