logo

Što je CompletableFuture?

A CompltableFuture koristi se za asinkrono programiranje. Asinkrono programiranje znači pisanje koda koji ne blokira. Izvodi zadatak na odvojenoj niti od glavne aplikacijske niti i obavještava glavnu nit o svom napretku, završetku ili neuspjehu.

Na taj način glavna nit ne blokira niti čeka dovršetak zadatka. Ostali zadaci se izvršavaju paralelno. Paralelizam poboljšava performanse programa.

CompletableFuture je klasa u Javi. Pripada paketu java.util.cocurrent. Implementira sučelje CompletionStage i Future.

Faza završetka

  • Izvodi radnju i vraća vrijednost kada se završi druga faza završetka.
  • Model za zadatak koji može pokrenuti druge zadatke.

Dakle, to je element lanca.

Kada više od jedne niti pokuša dovršiti - dovršiti iznimno ili poništiti CompletableFuture, samo jedna od njih uspije.

tipovi podataka u Javi

Budućnost nasuprot CompletableFuture

CompletableFuture je proširenje za Java Future API koji je predstavljen u Javi 8.

Future se koristi za asinkrono programiranje. Pruža dvije metode, isDone() i get(). Metode dohvaćaju rezultat izračuna kada se završi.

Ograničenja budućnosti

  • Budućnost ne može biti međusobno potpuna.
  • Ne možemo izvršiti daljnje radnje na rezultatu budućnosti bez blokiranja.
  • Future nema rukovanje iznimkama.
  • Ne možemo kombinirati više budućnosti.

Budućnost ima toliko ograničenja, zato imamo CompletableFuture. CompletableFuture pruža širok skup metoda za stvaranje više Futuresa, ulančavanje i kombiniranje. Također ima sveobuhvatnu podršku za rukovanje iznimkama.

Stvaranje CompletableFuture

CompletableFuture možemo stvoriti samo korištenjem sljedećeg konstruktora bez argumenata.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Primjer

Najčešće korištene metode CompletableFuture su:

    supplyAsync():Završava svoj posao asinkrono. Rezultat dobavljača pokreće zadatak iz ForkJoinPool.commonPool() kao zadani. Metoda supplyAsync() vraća CompletableFuture na koju možemo primijeniti druge metode.zatim primijeni():Metoda prihvaća funkciju kao argument. Vraća novu CompletableStage kada ova faza završi normalno. Nova faza koristi se kao argument dostavljene funkcije.pridružiti():metoda vraća rezultat nakon završetka. Također izbacuje CompletionException (neprovjerenu iznimku) ako se iznimno dovrši.
 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; } } 

Izlaz:

CompletableFuture u Javi

Rukovanje iznimkom CompletableFuture

Razmotrite sljedeću sliku koja predstavlja pet CF-ova:

CompletableFuture u Javi

Pretpostavimo da je pet CF-ova u izvršavanju i CF21 pokreće iznimku, tada su svi ovisni CF-ovi (CF31 i CF41) u pogrešci. To znači da:

aws crveni pomak
  • Poziv metode isCompletedExceptionally() vraća true.
  • Poziv get() izbacuje ExecutionException koji uzrokuje root Exception.

Razmotrite sljedeću sliku na kojoj smo izradili CF30 s izuzetkom.

CompletableFuture u Javi

Kada se CF21 izvršava normalno, tada CF30 samo prenosi vrijednost. Ako pokrene iznimku, CF30 to rješava i generira vrijednost za CF31.

Postoje tri metode za rješavanje iznimke:

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