logo

Co je CompletableFuture?

A CompltableFuture se používá pro asynchronní programování. Asynchronní programování znamená psaní neblokovacího kódu. Spouští úlohu v samostatném vláknu než hlavní aplikační vlákno a informuje hlavní vlákno o jejím průběhu, dokončení nebo selhání.

Tímto způsobem hlavní vlákno neblokuje ani nečeká na dokončení úkolu. Ostatní úkoly se provádějí paralelně. Paralelnost zlepšuje výkon programu.

CompletableFuture je třída v Javě. Patří do balíčku java.util.cocurrent. Implementuje rozhraní CompletionStage a Future.

Fáze dokončení

  • Provede akci a po dokončení další fáze dokončení vrátí hodnotu.
  • Model úlohy, který může spouštět další úlohy.

Jedná se tedy o prvek řetězce.

Když se více než jedno vlákno pokusí dokončit – výjimečně dokončit nebo zrušit CompletableFuture, uspěje pouze jedno z nich.

bublina třídit python

Budoucnost vs. CompletableFuture

CompletableFuture je rozšíření Java Future API, které bylo představeno v Javě 8.

Future se používá pro asynchronní programování. Poskytuje dvě metody, isDone() a get(). Metody získávají výsledek výpočtu po jeho dokončení.

Omezení budoucnosti

  • Budoucnost nemůže být vzájemně úplná.
  • Nemůžeme provést další akci na výsledek Future bez blokování.
  • Budoucnost nemá žádnou výjimku.
  • Nemůžeme kombinovat více budoucností.

Budoucnost má tolik omezení, proto máme CompletableFuture. CompletableFuture poskytuje širokou sadu metod pro vytváření více futures, řetězení a kombinování. Má také komplexní podporu zpracování výjimek.

Vytvoření CompletableFuture

CompletableFuture můžeme vytvořit pouze pomocí následujícího konstruktoru bez argumentů.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Příklad

Nejčastěji používané metody CompletableFuture jsou:

    supplyAsync():Svou práci dokončí asynchronně. Výsledek dodavatele je standardně spouštěn úlohou z ForkJoinPool.commonPool(). Metoda supplyAsync() vrací CompletableFuture, na kterou můžeme použít jiné metody.potomPoužít():Metoda přijímá funkci jako argument. Po normálním dokončení této fáze vrátí novou CompletableStage. Nová fáze se použije jako argument zadané funkce.připojit se():metoda po dokončení vrátí výslednou hodnotu. Vyhodí také CompletionException (nezaškrtnutá výjimka), pokud je dokončena výjimeč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; } } 

Výstup:

oříznutí řetězce javascript
CompletableFuture v Javě

Zpracování výjimek CompletableFuture

Zvažte následující obrázek, který představuje pět CF:

CompletableFuture v Javě

Předpokládejme, že pět CF v provádění a CF21 vyvolá výjimku, pak jsou všechny závislé CF (CF31 a CF41) chybné. Znamená to, že:

  • Volání metody isCompletedExceptionally() vrátí hodnotu true.
  • Volání get() vyvolá ExecutionException, která způsobí kořenovou výjimku.

Zvažte následující obrázek, na kterém jsme vytvořili CF30 s výjimkou.

CompletableFuture v Javě

Když se CF21 spustí normálně, pak CF30 pouze přenese hodnotu. Pokud vyvolá výjimku, CF30 ji zpracuje a vygeneruje hodnotu pro CF31.

Existují tři způsoby zpracování výjimky:

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