logo

Ce este CompletableFuture?

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:

    supplyAsync():Își încheie treaba în mod asincron. Rezultatul furnizorului este rulat de o sarcină din ForkJoinPool.commonPool() ca implicit. Metoda supplyAsync() returnează CompletableFuture pe care putem aplica alte metode.apoi Aplicați():Metoda acceptă funcția ca argumente. Returnează un nou CompletableStage când această etapă se finalizează normal. Utilizarea noii etape ca argument pentru funcția furnizată.a te alatura():metoda returnează valoarea rezultatului când este completă. De asemenea, aruncă o CompletionException (excepție nebifată) dacă este completată în mod excepțional.
 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
CompletableFuture în Java

Gestionarea excepțiilor pentru CompletableFuture

Luați în considerare următoarea figură, care reprezintă cele cinci CF-uri:

CompletableFuture în Java

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.

CompletableFuture în Java

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);