Futureを返す関数がある場合、futureが完了する直前にコールバックが呼び出されるコールバックも含める理由はありますか?
私が考えることができる唯一の利点は、将来の保留中のタスクの前にいくつかのアクションが実行されることを保証することと、アクションが将来の呼び出し先の同じスレッド内で発生することが保証されることです。
これのユースケースや実用的なアプリケーションはありますか?
グアバライブラリには ListenableFuture および SettableFuture の概念があります。
ListenableFuture
コールバックを登録できます 計算が完了すると、または計算がすでに完了している場合はすぐに実行されます。この単純な追加により、基本的なFuture
インターフェースではサポートできない多くの操作を効率的にサポートできます。
Runnable
インターフェースはFuture
結果への直接アクセスを提供しないため、そのようなアクセスを希望するユーザーは _Futures.addCallback
_ を好むかもしれません。 _FutureCallback<V>
_は2つのメソッドを実装します。
onSuccess(V)
、結果に基づいて未来が成功した場合に実行するアクションonFailure(Throwable)
、失敗に基づいてフューチャーが失敗した場合に実行するアクションListenableFuture
を使用する最も重要な理由は、非同期操作の複雑なチェーンを持つことが可能になることです。
別の操作が開始するとすぐにいくつかの操作を開始する必要がある場合(「ファンアウト」)、ListenableFuture
が機能するだけで、要求されたすべてのコールバックがトリガーされます。もう少し作業を進めると、他のいくつかのフューチャーがすべて終了するとすぐに、「ファンイン」またはListenableFutureをトリガーして計算を実行できます。例については、 Futures.allAsListの実装 を参照してください。
.NETでは、これらの概念はTask
、TaskCompletionSource
およびContinueWith
を使用して実装されます。