A CompltableFuture este folosit pentru programarea asincronă. Programarea asincronă înseamnă scrierea unui cod neblocant. Rulează o sarcină pe un fir separat decât firul principal al aplicației și notifică firul principal despre progresul, finalizarea sau eșecul acestuia.
În acest fel, firul principal nu se blochează și nici nu așteaptă finalizarea sarcinii. Alte sarcini se execută în paralel. Paralelismul îmbunătățește performanța programului.
Un CompletableFuture este o clasă în Java. Acesta aparține pachetului java.util.cocurrent. Implementează interfața CompletionStage și Future.
Etapa de finalizare
- Efectuează o acțiune și returnează o valoare când se încheie o altă etapă de finalizare.
- Un model pentru o sarcină care poate declanșa alte sarcini.
Prin urmare, este un element al unui lanț.
Când mai mult de un fir încearcă să se finalizeze - să finalizeze în mod excepțional sau să anuleze un CompletableFuture, doar unul dintre ele reușește.
matrice de programare java
Viitorul vs. CompletabilViitorul
Un CompletableFuture este o extensie a API-ului Java pentru viitor, care a fost introdusă în Java 8.
Un viitor este folosit pentru programarea asincronă. Acesta oferă două metode, isDone() și get(). Metodele preiau rezultatul calculului când acesta se finalizează.
Limitările viitorului
- Un viitor nu poate fi complet reciproc.
- Nu putem efectua acțiuni suplimentare asupra rezultatului unui viitor fără blocare.
- Viitorul nu are nicio excepție de gestionare.
- Nu putem combina mai multe viitoare.
Viitorul are atât de multe limitări, de aceea avem CompletableFuture. CompletableFuture oferă un set larg de metode pentru crearea mai multor viitor, înlănțuire și combinare. De asemenea, are suport complet pentru gestionarea excepțiilor.
Crearea unui viitor Completabil
Putem crea un CompletableFuture numai folosind următorul constructor fără argument.
CompletableFuture CompletableFuture = new CompletableFuture();
Exemplu
Cele mai frecvent utilizate metode CompletableFuture sunt:
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; } }
Ieșire:
piton de filtrare
Gestionarea excepțiilor pentru CompletableFuture
Luați în considerare următoarea figură, care reprezintă cele cinci CF-uri:
Să presupunem că cinci CF-uri în execuție și CF21 ridică o excepție, atunci toate CF-urile dependente (CF31 și CF41) sunt în eroare. Înseamnă că:
- Apelul la metoda isCompletedExceptionally() returnează true.
- Apelul la get() aruncă o ExecutionException care provoacă excepția rădăcină.
Luați în considerare următoarea figură, în care am creat CF30 cu o excepție.
Când CF21 se execută normal, atunci CF30 doar transmite valoarea. Dacă ridică o excepție, CF30 o gestionează și generează valoare pentru CF31.
Există trei metode de a gestiona o excepție:
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);