2

私の目標は、10個(またはその他の任意の数)の非同期操作から結果のリストを取得することです。

私はcom.google.guava並行してユーティリティに使用しています。誰かが私を正しい方向に丁寧に向けることができれば、私は大いに感謝するでしょう。

この例では、リストを取得しようとしていますsuccessfulBombsBombほとんど空のオブジェクトですが、サービス呼び出しの実行に関する問題をシミュレートするために作成すると、ランダムに問題がスローされる可能性があります)

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
List<ListenableFuture<Bomb>> bombs;
ListenableFuture<List<Bomb>> successfulBombs;

編集:

これは私がこれまでに思いついたものですが、いくつかの成功した要素が含まれているはずなのにリストは空です...理由がよくわかりません

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
List<ListenableFuture<Bomb>> bombs = new ArrayList<ListenableFuture<Bomb>>();
for(int i=0;i<10;i++)
{
    ListenableFuture<Bomb> bomb = service.submit(new Callable<Bomb>(){
        public Bomb call() throws Problem
        {
            return craftBomb();
        }
    });
}
ListenableFuture<List<Bomb>> successfulBombs = Futures.successfulAsList(bombs);
Futures.addCallback(successfulBombs, new FutureCallback<List<Bomb>>(){
    public void onSuccess(List<Bomb> bombs)
    {
        System.out.println("My successful bombs");
        for(Bomb b : bombs)
        {
            System.out.println(b);
        }
    }
    public void onFailure(Throwable thrown)
    {
        System.err.println("There was a problem making this bomb.");
    }
});

私が探しているものを締めくくるにあたり:

  • 非同期操作を開始するための正しいパターン
  • 結果の操作のリストを収集する
  • guavaフレームワークを使用して成功した操作のリストを収集する
4

3 に答える 3

6

に何も追加していないため、リストは空ですbombs。に空のリストを渡していますFutures.successfulAsList

于 2012-04-28T02:08:15.800 に答える
5

お探しListeningExecutorService.invokeAll(List<Callable<T>>)ですか?おそらくと組み合わせてFutures.allAsList(List<ListenableFuture<T>>)

于 2012-04-28T01:01:09.847 に答える
1

実用的な解決策は次のとおりです

    ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
    List<ListenableFuture<Bomb>> bombs = new ArrayList<ListenableFuture<Bomb>>();
    for(int i=0;i<10;i++)
    {
        ListenableFuture<Bomb> bomb = service.submit(new Callable<Bomb>(){
            public Bomb call() throws Problem
            {
                return craftBomb();
            }
        });
        bombs.add(bomb);
    }
    ListenableFuture<List<Bomb>> successfulBombs = Futures.successfulAsList(bombs);
    Futures.addCallback(successfulBombs, new FutureCallback<List<Bomb>>(){
        public void onSuccess(List<Bomb> bombs)
        {
            System.out.println("My successful bombs");
            for(Bomb b : bombs)
            {
                System.out.println(b);
            }
        }
        public void onFailure(Throwable thrown)
        {
            System.err.println("There was a problem making this bomb.");
        }
    });
于 2012-04-28T02:10:06.273 に答える