Neben dem Rückgabetyp Future vs. CompleableFuture gibt es bemerkenswerte Unterschiede. Oder Wann soll was genutzt werden?
Es ist wirklich ziemlich einfach. Sie verwenden die Future
, wenn Sie möchten, dass der ausführende Thread auf asynchrone Berechnungsantwort wartet. Ein Beispiel dafür ist eine parallele Zusammenführung/Sortierung. Sortiere asynchron links, sortiere synchron, warte nach links, um abzuschließen (future.get()
), füge Ergebnisse zusammen.
Sie verwenden eine CompleteableFuture
, wenn Sie möchten, dass eine Aktion mit dem Ergebnis nach Abschluss asynchron vom ausgeführten Thread ausgeführt wird. Zum Beispiel: Ich möchte einige Berechnungen asynchron durchführen und die Ergebnisse bei der Berechnung in ein System schreiben. Der anfordernde Thread muss dann möglicherweise nicht auf ein Ergebnis warten.
Sie können das obige Beispiel in einer einzigen ausführbaren Future-Datei nachahmen, aber die CompletableFuture
bietet eine flüssigere Schnittstelle mit besserer Fehlerbehandlung.
Es hängt wirklich davon ab, was Sie tun möchten.
Und was sind die Unterschiede, wenn ich die CompletableFutureApi mit Standard Executor (die Methode ohne Executor) verwenden?
Es wird an ForkJoin.commonPool()
delegieren, die eine Standardgröße zu der Anzahl der CPUs auf Ihrem System ist. Wenn Sie etwas IO-intensives (Lesen und Schreiben in das Dateisystem) tun, sollten Sie den Thread-Pool anders definieren.
Wenn es CPU-intensiv ist, macht die Verwendung des commonPool am meisten Sinn.
'CompletableFuture' ist neuer und hat viel mehr Fähigkeiten mit einer überlegenen API. Ich empfehle es wann immer möglich zu verwenden. 'Future' ist beklagenswert. –
Gibt es Fakten? Ich möchte Code nicht refaktorieren, weil eine API nur "neuer" imho ist, könnte es Executorservices geben, die CompetableFuture zurückgeben. – dermoritz
Das grundlegende Problem mit 'Future' ist, dass Sie Threads verschwenden müssen, die auf ihre Fertigstellung warten. 'CompletableFuture' dreht das Skript um und ruft in der Zukunft Callbacks auf, wenn es fertig ist. Sie müssen keinen Thread bei 'get()' blockieren. –