Middle
¿Para qué sirve CompletableFuture en Java?
sobes.tech AI
Respuesta de la IA
CompletableFuture se utiliza para la ejecución asíncrona de tareas y la composición de operaciones asíncronas. Representa el resultado de una operación asíncrona que puede completarse en el futuro.
Las principales ventajas y razones para usarlo:
- Ejecución asíncrona: Permite realizar tareas en segundo plano sin bloquear el hilo principal.
- Composición de operaciones asíncronas: Permite encadenar varias tareas asíncronas, definiendo cómo deben ejecutarse secuencial o paralelamente, y procesar sus resultados.
- Manejo de excepciones: Proporciona mecanismos para gestionar errores en tareas asíncronas.
- Flexibilidad: Soporta diferentes métodos para procesar el resultado (por ejemplo, aplicar funciones, ejecutar la siguiente tarea) y definir los hilos de ejecución.
Ejemplos de uso:
-
Ejecutar varias tareas independientes en paralelo y esperar a que finalicen:
// Ejemplo de ejecución paralela de dos tareas CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> { // Operación larga 1 return "Resultado 1"; }); CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> { // Operación larga 2 return "Resultado 2"; }); CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2); combinedFuture.join(); // Esperar a que ambas tareas finalicen -
Ejecutar operaciones asíncronas secuenciales:
// Ejemplo de ejecución secuencial de tareas CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Valor inicial"); CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> { // Transformar el resultado return result.length(); }); transformedFuture.thenAccept(length -> { System.out.println("Longitud de la cadena: " + length); }); -
Manejo de excepciones:
// Ejemplo de manejo de excepción CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> { if (true) { throw new RuntimeException("Ocurrió un error"); } return "Éxito"; }).exceptionally(ex -> { System.err.println("Manejo de error: " + ex.getMessage()); return "Error manejado"; // Valor de reserva }); System.out.println(errorFuture.join());