Callable
Callable
Uso de Callable y Future en Java: Bloqueo y Consideraciones
En Java, si necesitas ejecutar una tarea en un hilo y devolver un resultado, debes usar la interfaz Callable<T> en lugar de Runnable. Sin embargo, hay aspectos importantes a considerar al usar Future<T> para recuperar el resultado de la ejecución.
Flujo de Ejecución Explicado
La imagen muestra un diagrama de secuencia que representa cómo el hilo principal interactúa con un pool de hilos al ejecutar una tarea con Callable<T> y recuperar el resultado con Future<T>.
- El hilo principal envía una tarea al pool de hilos utilizando
submit(callable). - El método
submitdevuelve un objetoFuture<T>, que actúa como un marcador de posición para el resultado futuro de la tarea. - El hilo principal continúa ejecutándose, pero en algún momento llama a
future.get(). - Si la tarea aún no ha finalizado, el método
get()bloquea la ejecución del hilo principal hasta que el resultado esté disponible. - Cuando la tarea termina, el resultado es devuelto, y el hilo principal reanuda su ejecución.
Consideraciones Importantes sobre future.get()
- Bloqueo del hilo principal:
- Si
future.get()se llama antes de que la tarea haya terminado, el hilo principal se bloqueará hasta que el resultado esté disponible. - Esto puede afectar el rendimiento si no se maneja correctamente.
- Si
- Posibles excepciones:
InterruptedException: si el hilo es interrumpido mientras espera.ExecutionException: si la tarea lanza una excepción.
- Alternativa no bloqueante:
- Puedes usar
future.isDone()para verificar si el resultado está listo antes de llamar aget().
- Puedes usar
Uso de CompletableFuture para evitar bloqueos:
- En lugar de
Future, Java 8 introdujoCompletableFuture, que permite manejar tareas asincrónicas de manera más eficiente sin bloquear el hilo principal.