Java Callable Future Example
Uno dei vantaggi del framework Java executor è che possiamo eseguire attività simultanee che possono restituire un singolo risultato dopo l’elaborazione delle attività. L’API di concorrenza Java raggiunge questo con le seguenti due interfacce Callable
e Future
.
Java Callable e Future interfaces
1.1. Callable
Callable
interfaccia ha il call()
metodo. In questo metodo, dobbiamo implementare la logica di un compito. L’interfaccia Callable
è un’interfaccia parametrizzata, il che significa che dobbiamo indicare il tipo di dati che il metodo call()
restituirà.
2.2. L’interfaccia Future
Future
ha metodi per ottenere il risultato generato da un oggetto Callable
e per gestirne lo stato.
Java Callable Future Example
In questo esempio, stiamo creando un FactorialCalculator
che è di tipo Callable
. Significa che sovrascriveremo il metodo call()
e dopo il calcolo, restituiremo il risultato dal metodo call()
. Questo risultato in seguito può essere recuperato da Future
riferimento detenuto dal programma principale.
Ora testiamo la calcolatrice fattoriale sopra usando due thread e 4 numeri.
Uscita del programma.
Qui abbiamo inviato un oggetto Callable
da eseguire in un esecutore usando il metodo submit()
. Questo metodo riceve un oggetto Callable
come parametro e restituisce un oggetto Future
che possiamo utilizzare con due obiettivi principali–
- Possiamo controllare lo stato dell’attività – possiamo annullare l’attività e verificare se è terminata. A tale scopo, abbiamo utilizzato il metodo
isDone()
per verificare se le attività erano terminate. - Possiamo ottenere il risultato restituito dal metodo call (). A tale scopo, abbiamo utilizzato il metodo
get()
. Questo metodo attende fino a quando l’oggettoCallable
ha terminato l’esecuzione del metodocall()
e ha restituito il risultato.Se il thread viene interrotto mentre il metodo
get()
è in attesa del risultato, genera un’eccezioneInterruptedException
. Se il metodocall()
genera un’eccezione, questo metodo genera un’eccezioneExecutionException
.
L’interfaccia Future
fornisce un’altra versione del metodo get()
, ovvero get (longtimeout, TimeUnitunit). Questa versione del metodo get, se il risultato dell’attività non è disponibile, lo attende per il tempo specificato. Se il periodo di tempo specificato passa e il risultato non è ancora disponibile, il metodo restituisce un valore null
.
Buon apprendimento !!