Sobes.tech
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:

  1. 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
    
  2. 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);
    });
    
  3. 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());