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:
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:
Gestió d'excepcions de CompletableFuture
Considereu la figura següent, que representa els cinc CF:
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ó.
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);