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:
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:
Rukovanje iznimkom CompletableFuture
Razmotrite sljedeću sliku koja predstavlja pet CF-ova:
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.
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);