複数の低速なサード パーティ サービスを非同期的に呼び出す、単一のブロッキング メソッドでいくつかのコードを記述しています。これらの非同期呼び出しは、同じインターフェイス メソッドを実装するコードにラップされます。非同期呼び出しを開始し、それらがすべて返されるまで待ってから、ブロッキング メソッド呼び出しを返します。
それが明確であることを願っています!
これを実装するための適切な設計パターン/ライブラリはありますか...それはかなり一般的なパターンでなければなりません。前もって感謝します。
複数の低速なサード パーティ サービスを非同期的に呼び出す、単一のブロッキング メソッドでいくつかのコードを記述しています。これらの非同期呼び出しは、同じインターフェイス メソッドを実装するコードにラップされます。非同期呼び出しを開始し、それらがすべて返されるまで待ってから、ブロッキング メソッド呼び出しを返します。
それが明確であることを願っています!
これを実装するための適切な設計パターン/ライブラリはありますか...それはかなり一般的なパターンでなければなりません。前もって感謝します。
非同期呼び出しの数で初期化されたを使用し、CountDownLatch各非同期ハンドラーにラッチをデクリメントさせることができます。「外部」ブロッキング メソッドは、完全なカウントダウンを単に「待機」します。たとえば、次のようになります。
// Untested, Java pseudocode...
public void awaitAllRemoteCalls() {
final CountDownLatch allDoneSignal = new CountDownLatch(N);
// For each remote N calls...
thirdPartyAsyncCall.call(new AsyncHandler(Object remoteData) {
// Handle the remote data...
allDoneSignal.countDown();
});
allDoneSignal.await();
}
あなたがどのようにやっているかはわかりませんが、非同期タスクを開始するものは何でも(できれば を使用して)、開始するタスクごとに をExecutor返します。Future<?>次に、すべてのFuture<?>s を aに入れて、Collection呼び出しを繰り返すだけget()です。
List<Future<?>> futures = startAsyncTasks();
for (Future<?> future : futures) {
future.get();
}
// all async tasks are finished
ここでは例外処理を省略しましget()たが、それが一般的な考え方です。