Ich füge hier ein bisschen hinzu, weil ich in letzter Zeit mit einer Fülle von Futures in Java gearbeitet habe, aber auch einen Hintergrund in der Scala / Akka-Entwicklung habe. Diese Antwort wird größtenteils das Gesagte duplizieren, aber auf die Fülle von Implementierungen hinweisen, die heutzutage in der JVM häufig verwendet werden.
Erstens erwähnen Originalposter Get und Blocking - bitte tun Sie dies niemals außerhalb von Tests.
Wenn ich in meiner aktuellen Rolle FP- und Concurrency-Konzepte unterrichte, sage ich dem Schüler zuerst, dass semantische Versprechen und Zukünfte Synonyme sind, da der Entwickler als Konsument eines Versprechens oder einer zukünftigen API nicht verstehen muss, dass es solche gibt oder WENN es solche gibt semantische Unterschiede - nur die Mechanik für den Umgang mit ihnen, ohne IO zu blockieren.
Zu sagen, dass eine Zukunft nicht abgeschlossen werden kann und ein Versprechen (z. B. nach scala / akka / play apis), ist zu einfach:
Einige Futures können vervollständigt werden.
Java8 führt jetzt eine CompletableFuture in die Standardbibliothek ein.
Einige Versprechungen können nicht
erfüllt werden Ebenso kann in der Play Promise API eine Versprechung nicht erfüllt werden, aber eine RedeemablePromise kann so gespielt werden, dass eine andere Semantik eingeführt wird - selbst wenn Sie sich unter dem Typesafe-Dach befinden. Darüber hinaus kann Play Promise API mit Scala Futures in beide Richtungen konvertieren - (F.Promise.wrap (future) oder promise.wrapped ()).
Wenn Sie mit der Typesafe-Technologie auf Java8 arbeiten, wechseln Sie häufig zwischen Futures / Versprechungen hin und her, nur weil eine API vorzuziehen ist (die Play Promise-API scheint bei Java8-Lambdas besser zu sein). Auf Akka + Play + Java8 nehmen Sie die Zukünfte von Schauspielern und wickeln sie in Versprechungen ein, verfassen Rückrufe und geben diese vom Controller zurück.
Wenn ich den Leuten erzähle, dass ich unterrichte, sind Versprechen und Zukünfte mehr oder weniger Synonyme.