Ejemplo Java Callable Future
Uno de los beneficios del framework Java executor es que podemos ejecutar tareas simultáneas que pueden devolver un solo resultado después de procesar las tareas. La API de simultaneidad de Java logra esto con las siguientes dos interfaces Callable
y Future
.
Interfaces Java llamables y futuras
1.1. La interfaz llamable
Callable
tiene el método call()
. En este método, tenemos que implementar la lógica de una tarea. La interfaz Callable
es una interfaz parametrizada, lo que significa que tenemos que indicar el tipo de datos que devolverá el método call()
.
2.2. La interfaz Future
Future
tiene métodos para obtener el resultado generado por un objeto Callable
y para administrar su estado.
Ejemplo futuro llamable de Java
En este ejemplo, estamos creando un FactorialCalculator
que es de tipo Callable
. Significa que anularemos su método call()
y después del cálculo, devolveremos el resultado del método call()
. Este resultado se puede recuperar más tarde de la referencia Future
mantenida por el programa principal.
Ahora probemos la calculadora factorial anterior usando dos hilos y 4 números.
Salida del programa.
Aquí enviamos un objeto Callable
para ser ejecutado en un ejecutor usando el método submit()
. Este método recibe un objeto Callable
como parámetro y devuelve un objeto Future
que podemos usar con dos objetivos principales–
- Podemos controlar el estado de la tarea – podemos cancelar la tarea y comprobar si ha terminado. Para este propósito, hemos utilizado el método
isDone()
para verificar si las tareas habían terminado. - podemos obtener el resultado devuelto por el método call (). Para ello, hemos utilizado el método
get()
. Este método espera hasta que el objetoCallable
haya finalizado la ejecución del métodocall()
y haya devuelto su resultado.Si el hilo se interrumpe mientras el método
get()
espera el resultado, lanza una excepciónInterruptedException
. Si el métodocall()
lanza una excepción, este método lanza una excepciónExecutionException
.
La interfaz Future
proporciona otra versión del método get()
, es decir, get (longtimeout, TimeUnitunit). Esta versión del método get, si el resultado de la tarea no está disponible, lo espera durante el tiempo especificado. Si el período de tiempo especificado pasa y el resultado aún no está disponible, el método devuelve un valor null
.
Feliz Aprendizaje !!