FutureとPromiseの違いは何ですか?質問する

FutureとPromiseの違いは何ですか?質問する

Futureとの違いは何ですかPromise?
どちらも将来の結果のプレースホルダーとして機能しますが、主な違いはどこにあるのでしょうか?

ベストアンサー1

(これまでの回答に完全に満足していないので、ここで私の試みを示します...)

私は思うケビン・ライトのコメント

約束はできますが、それを守るかどうかはあなた次第です。誰かがあなたに約束をしたときは、その人が将来それを守ってくれるかどうかを見守らなければなりません。

かなりうまく要約されていますが、説明があると便利です。

未来と約束これらは非常に似た概念ですが、違いは、Futureはまだ存在しない結果のための読み取り専用のコンテナであるのに対し、Promiseは(通常は1回だけ)書き込むことができるという点です。Java 8完了可能な未来グアバ設定可能な未来値を設定できる (「完了」) ため、Promise と考えることができますが、Future インターフェイスも実装しているため、クライアントにとっては違いはありません。

未来の結果は「他の誰か」、つまり非同期計算の結果によって設定されます。将来のタスク- 古典的な future - はCallable または Runnable で初期化する必要があり、引数なしのコンストラクタはなく、Future と FutureTask は両方とも外部からは読み取り専用です (FutureTask の set メソッドは保護されています)。値は内部からの計算結果に設定されます。

一方、Promise の結果は、パブリック セッター メソッドがあるため、いつでも「あなた」(または実際には誰でも) によって設定できます。CompletableFuture と SettableFuture はどちらもタスクなしで作成でき、いつでも値を設定できます。Promise をクライアント コードに送信し、後で必要に応じて実行します。

CompletableFuture は「純粋な」プロミスではなく、FutureTask と同様にタスクで初期化でき、その最も便利な機能は処理ステップの無関係な連鎖であることに注意してください。

また、Promise は Future のサブタイプである必要はなく、同じオブジェクトである必要もありません。Scala では、Future オブジェクトは非同期計算または別のPromise オブジェクトによって作成されます。C++ でも状況は同様です。Promise オブジェクトはプロデューサーによって使用され、Future オブジェクトはコンシューマーによって使用されます。この分離の利点は、クライアントが Future の値を設定できないことです。

両方そしてJBoss 3.1 の新機能AsyncResult クラスがあり、これは Scala/C++ の Promise に似ています。AsyncResult は Future を実装していますが、これは実際の Future ではありません。Spring/EJB の非同期メソッドは、バックグラウンド マジックを通じて別の読み取り専用の Future オブジェクトを返します。この 2 番目の「実際の」 Future は、クライアントが結果にアクセスするために使用できます。

おすすめ記事