9

複数の低速なサード パーティ サービスを非同期的に呼び出す、単一のブロッキング メソッドでいくつかのコードを記述しています。これらの非同期呼び出しは、同じインターフェイス メソッドを実装するコードにラップされます。非同期呼び出しを開始し、それらがすべて返されるまで待ってから、ブロッキング メソッド呼び出しを返します。

それが明確であることを願っています!

これを実装するための適切な設計パターン/ライブラリはありますか...それはかなり一般的なパターンでなければなりません。前もって感謝します。

4

2 に答える 2

9

非同期呼び出しの数で初期化されたを使用し、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();
}
于 2011-02-08T20:10:36.290 に答える
2

あなたがどのようにやっているかはわかりませんが、非同期タスクを開始するものは何でも(できれば を使用して)、開始するタスクごとに をExecutor返します。Future<?>次に、すべてのFuture<?>s を aに入れて、Collection呼び出しを繰り返すだけget()です。

List<Future<?>> futures = startAsyncTasks();
for (Future<?> future : futures) {
  future.get();
}
// all async tasks are finished

ここでは例外処理を省略しましget()たが、それが一般的な考え方です。

于 2011-02-08T20:16:45.060 に答える