logo

¿Qué es CompletableFuture?

A CompltableFuturo Se utiliza para programación asincrónica. La programación asincrónica significa escribir código sin bloqueo. Ejecuta una tarea en un hilo separado del hilo principal de la aplicación y notifica al hilo principal sobre su progreso, finalización o falla.

De esta forma, el hilo principal no se bloquea ni espera a que se complete la tarea. Otras tareas se ejecutan en paralelo. El paralelismo mejora el rendimiento del programa.

CompletableFuture es una clase en Java. Pertenece al paquete java.util.cocurrent. Implementa la interfaz CompletionStage y Future.

Etapa de finalización

  • Realiza una acción y devuelve un valor cuando se completa otra etapa de finalización.
  • Un modelo para una tarea que puede desencadenar otras tareas.

Por tanto, es un elemento de una cadena.

Cuando más de un hilo intenta completarse (completar excepcionalmente o cancelar un CompletableFuture), solo uno de ellos tiene éxito.

programas de muestra java

Futuro versus Futuro Completable

CompletableFuture es una extensión de la API Future de Java que se introdujo en Java 8.

Un futuro se utiliza para la programación asincrónica. Proporciona dos métodos, isDone() y get(). Los métodos recuperan el resultado del cálculo cuando se completa.

Limitaciones del futuro

  • Un futuro no puede ser mutuamente completo.
  • No podemos realizar más acciones sobre el resultado de un Futuro sin bloquearlo.
  • Future no tiene ningún manejo de excepciones.
  • No podemos combinar múltiples futuros.

El futuro tiene tantas limitaciones, por eso tenemos CompletableFuture. CompletableFuture proporciona un amplio conjunto de métodos para crear, encadenar y combinar múltiples futuros. También cuenta con soporte integral para el manejo de excepciones.

Creando un futuro completable

Podemos crear un CompletableFuture solo usando el siguiente constructor sin argumentos.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Ejemplo

Los métodos CompletableFuture más utilizados son:

    suministroAsync():Completa su trabajo de forma asincrónica. El resultado del proveedor se ejecuta mediante una tarea de ForkJoinPool.commonPool() de forma predeterminada. El método SupplyAsync() devuelve CompletableFuture al que podemos aplicar otros métodos.luegoAplicar():El método acepta la función como argumento. Devuelve un nuevo CompletableStage cuando esta etapa se completa normalmente. La nueva etapa se utiliza como argumento de la función proporcionada.unirse():el método devuelve el valor del resultado cuando se completa. También arroja una CompletionException (excepción no marcada) si se completa de manera excepcional.
 import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } } 

Producción:

creación de tabla de oráculo
CompletableFuture en Java

Manejo de excepciones de CompletableFuture

Considere la siguiente figura, que representa los cinco FC:

CompletableFuture en Java

Supongamos que hay cinco CF en ejecución y CF21 genera una excepción, entonces todos los CF dependientes (CF31 y CF41) tienen errores. Esto significa que:

  • La llamada al método isCompletedExceptionally() devuelve verdadero.
  • La llamada a get() genera una ExecutionException que provoca la excepción raíz.

Considere la siguiente figura, en la que hemos creado CF30 con una excepción.

CompletableFuture en Java

Cuando CF21 se ejecuta normalmente, CF30 simplemente transmite el valor. Si genera una excepción, CF30 la maneja y genera valor para CF31.

Hay tres métodos para manejar una excepción:

 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);