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:
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
Zpracování výjimek CompletableFuture
Zvažte následující obrázek, který představuje pět CF:
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.
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);