4

私は最近、Google Guava と ListenableFutures を幅広く使用してきましたが、将来の補完の順不同のストリーミング ハンドラーを提供する方法が欠けていると感じています。私が想定しているのは、別の未来が戻るまでnext()をブロックするイテラブルです。

自分で作成する前に、すでに存在するものはありますか?

そうでない場合は、ListenableFuture のコールバック機能を利用して結果を BlockingQueue にプッシュすることを考えました。目標は、返された値をすぐに処理することです。Futures.successfulAsList()素晴らしいですが、他の有用な作業をスケジュールするのではなく、戻る前にすべての値を待ちます。

4

2 に答える 2

7

使用できますjava.util.concurrent.CompletionService。をスローしなかった場合、そのメソッドtakeは簡単にラップできます。Iterator.next()InterruptedException

于 2012-09-03T19:27:03.387 に答える
1

が.NETで見たのと同じトリックを使用できると思います:Task<T>

  • 新しいList<SettableFuture<T>>値を作成します-入力先物と同じ数
  • 「これまでに完了した先物の数」のカウンターを保持します
  • 入力先物ごとに、リスナーを追加して、先物が完了すると、カウンターをインクリメントし、リスト内の対応するアイテムにその値(またはエラー)を設定します。
  • リストを発信者に返します

これで、入力シーケンスに対応する先物のシーケンスになりましたが、入力が完了する順序になっています。次に、呼び出し元はリストを繰り返し処理して、各リストが順番に完了するのを待ちます。

于 2012-09-03T16:52:36.440 に答える