web-dev-qa-db-ja.com

futureが返された場合にコールバックを実装する使用例はありますか?

Futureを返す関数がある場合、futureが完了する直前にコールバックが呼び出されるコールバックも含める理由はありますか?

私が考えることができる唯一の利点は、将来の保留中のタスクの前にいくつかのアクションが実行されることを保証することと、アクションが将来の呼び出し先の同じスレッド内で発生することが保証されることです。

これのユースケースや実用的なアプリケーションはありますか?

4
Zhro

グアバライブラリには ListenableFuture および SettableFuture の概念があります。

ListenableFutureコールバックを登録できます 計算が完了すると、または計算がすでに完了している場合はすぐに実行されます。この単純な追加により、基本的なFutureインターフェースではサポートできない多くの操作を効率的にサポートできます。

RunnableインターフェースはFuture結果への直接アクセスを提供しないため、そのようなアクセスを希望するユーザーは _Futures.addCallback_ を好むかもしれません。 _FutureCallback<V>_は2つのメソッドを実装します。

  • onSuccess(V)、結果に基づいて未来が成功した場合に実行するアクション
  • onFailure(Throwable)、失敗に基づいてフューチャーが失敗した場合に実行するアクション

ListenableFutureを使用する最も重要な理由は、非同期操作の複雑なチェーンを持つことが可能になることです。

別の操作が開始するとすぐにいくつかの操作を開始する必要がある場合(「ファンアウト」)、ListenableFutureが機能するだけで、要求されたすべてのコールバックがトリガーされます。もう少し作業を進めると、他のいくつかのフューチャーがすべて終了するとすぐに、「ファンイン」またはListenableFutureをトリガーして計算を実行できます。例については、 Futures.allAsListの実装 を参照してください。

.NETでは、これらの概念はTaskTaskCompletionSourceおよびContinueWithを使用して実装されます。

4
Robert Harvey