logo

Què és CompletableFuture?

A Futur Compltable s'utilitza per a la programació asíncrona. La programació asíncrona significa escriure codi no bloquejador. Executa una tasca en un fil diferent del fil de l'aplicació principal i notifica al fil principal sobre el seu progrés, finalització o fallada.

D'aquesta manera, el fil principal no bloqueja ni espera la finalització de la tasca. Altres tasques s'executen en paral·lel. El paral·lelisme millora el rendiment del programa.

Un CompletableFuture és una classe en Java. Pertany al paquet java.util.cocurrent. Implementa la interfície CompletionStage i Future.

Etapa de finalització

  • Realitza una acció i retorna un valor quan es completa una altra etapa de finalització.
  • Un model per a una tasca que pot desencadenar altres tasques.

Per tant, és un element d'una cadena.

Quan més d'un fil intenta completar-se - completar excepcionalment o cancel·lar un CompletableFuture, només un d'ells té èxit.

jquery un clic

Futur vs CompletableFuture

Un CompletableFuture és una extensió de l'API Future de Java que es va introduir a Java 8.

Un futur s'utilitza per a la programació asíncrona. Proporciona dos mètodes, isDone() i get(). Els mètodes recuperen el resultat del càlcul quan es completa.

Limitacions del futur

  • Un futur no es pot completar mútuament.
  • No podem realitzar més accions sobre el resultat d'un futur sense bloquejar.
  • El futur no té cap excepció de maneig.
  • No podem combinar múltiples futurs.

El futur té tantes limitacions, per això tenim CompletableFuture. CompletableFuture ofereix un ampli conjunt de mètodes per crear múltiples futurs, encadenar i combinar. També té un suport integral per a la gestió d'excepcions.

Creant un Futur Completable

Només podem crear un CompletableFuture utilitzant el següent constructor sense argument.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Exemple

Els mètodes CompletableFuture més utilitzats són:

    supplyAsync():Completa la seva feina de manera asíncrona. El resultat del proveïdor l'executa una tasca de ForkJoinPool.commonPool() per defecte. El mètode supplyAsync() retorna CompletableFuture al qual podem aplicar altres mètodes.llavors Aplica ():El mètode accepta la funció com a arguments. Torna una nova CompletableStage quan aquesta etapa es completa amb normalitat. La nova etapa s'utilitza com a argument per a la funció subministrada.uneix-te ():el mètode retorna el valor del resultat quan s'ha completat. També llança una CompletionException (excepció no marcada) si es 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; } } 

Sortida:

CompletableFuture a Java

Gestió d'excepcions de CompletableFuture

Considereu la figura següent, que representa els cinc CF:

CompletableFuture a Java

Suposem que Cinc CF en execució i CF21 planteja una excepció, llavors tots els CF dependents (CF31 i CF41) estan equivocats. Vol dir això:

  • La crida al mètode isCompletedExceptionally() retorna true.
  • La crida a get() llança una ExecutionException que provoca l'excepció arrel.

Considereu la figura següent, en la qual hem creat CF30 amb una excepció.

CompletableFuture a Java

Quan CF21 s'executa normalment, CF30 només transmet el valor. Si genera una excepció, CF30 la gestiona i genera valor per a CF31.

Hi ha tres mètodes per gestionar una excepció:

llistes de làtex
 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);