logo

Was ist CompletableFuture?

A CompltableFuture wird für die asynchrone Programmierung verwendet. Asynchrone Programmierung bedeutet, nicht blockierenden Code zu schreiben. Es führt eine Aufgabe in einem anderen Thread als dem Hauptanwendungsthread aus und benachrichtigt den Hauptthread über Fortschritt, Abschluss oder Fehler.

Auf diese Weise blockiert der Hauptthread nicht und wartet nicht auf den Abschluss der Aufgabe. Andere Aufgaben werden parallel ausgeführt. Parallelität verbessert die Leistung des Programms.

Ein CompletableFuture ist eine Klasse in Java. Es gehört zum Paket java.util.cocurrent. Es implementiert die CompletionStage- und Future-Schnittstelle.

Fertigstellungsphase

  • Es führt eine Aktion aus und gibt einen Wert zurück, wenn eine andere Abschlussphase abgeschlossen ist.
  • Ein Modell für eine Aufgabe, das möglicherweise andere Aufgaben auslöst.

Daher ist es ein Element einer Kette.

Wenn mehr als ein Thread versucht, eine CompletableFuture abzuschließen – ausnahmsweise abzuschließen oder abzubrechen –, ist nur einer von ihnen erfolgreich.

Python speichert JSON in einer Datei

Zukunft vs. CompletableFuture

Ein CompletableFuture ist eine Erweiterung der Future API von Java, die in Java 8 eingeführt wurde.

Ein Future wird für die asynchrone Programmierung verwendet. Es bietet zwei Methoden, isDone() und get(). Die Methoden rufen das Ergebnis der Berechnung ab, wenn diese abgeschlossen ist.

Grenzen der Zukunft

  • Eine Zukunft kann nicht gegenseitig vollständig sein.
  • Ohne Blockierung können wir keine weiteren Aktionen am Ergebnis eines Futures durchführen.
  • Future hat keine Ausnahmebehandlung.
  • Wir können nicht mehrere Zukünfte kombinieren.

Future hat so viele Einschränkungen, deshalb haben wir CompletableFuture. CompletableFuture bietet eine breite Palette von Methoden zum Erstellen, Verketten und Kombinieren mehrerer Futures. Es bietet außerdem umfassende Unterstützung für die Ausnahmebehandlung.

Eine vervollständigbare Zukunft schaffen

Wir können ein CompletableFuture nur erstellen, indem wir den folgenden Konstruktor ohne Argumente verwenden.

Staaten in den USA
 CompletableFuture CompletableFuture = new CompletableFuture(); 

Beispiel

Die am häufigsten verwendeten CompletableFuture-Methoden sind:

    SupplyAsync():Es erledigt seine Arbeit asynchron. Das Ergebnis des Lieferanten wird standardmäßig von einer Aufgabe von ForkJoinPool.commonPool() ausgeführt. Die Methode „supplyAsync()“ gibt „CompletableFuture“ zurück, auf das wir andere Methoden anwenden können.thenApply():Die Methode akzeptiert Funktionen als Argumente. Es gibt eine neue CompletableStage zurück, wenn diese Phase normal abgeschlossen wird. Die neue Stufe wird als Argument für die bereitgestellte Funktion verwendet.verbinden():Die Methode gibt nach Abschluss den Ergebniswert zurück. Bei einem außergewöhnlichen Abschluss wird außerdem eine CompletionException (ungeprüfte Ausnahme) ausgelöst.
 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; } } 

Ausgabe:

CompletableFuture in Java

Ausnahmebehandlung von CompletableFuture

Betrachten Sie die folgende Abbildung, die die fünf CFs darstellt:

CompletableFuture in Java

Angenommen, fünf CFs werden ausgeführt und CF21 löst eine Ausnahme aus, dann sind alle abhängigen CFs (CF31 und CF41) fehlerhaft. Das bedeutet:

  • Der Aufruf der Methode isCompletedExceptionally() gibt true zurück.
  • Der Aufruf von get() löst eine ExecutionException aus, die die Root-Ausnahme verursacht.

Betrachten Sie die folgende Abbildung, in der wir CF30 mit einer Ausnahme erstellt haben.

CompletableFuture in Java

Wenn CF21 normal ausgeführt wird, überträgt CF30 nur den Wert. Wenn eine Ausnahme ausgelöst wird, behandelt CF30 diese und generiert einen Wert für CF31.

Es gibt drei Methoden zur Behandlung einer Ausnahme:

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