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 objetoCallablehaya 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 !!