2013-12-10 8 views
8

最近、私はAPIを使用して少し仕事を掘り下げました。 APIは、Unirest httpライブラリを使用してWebからの受信作業を簡素化します。もちろん、APIサーバーからデータが呼び出されるため、APIへの非同期呼び出しを使用して効率的に処理しようとしました。次のように私の考えは、構造化されています。複数の先物のコールバックを待っています

  1. したがって、私はすべてのデータを持っている必要があり、データ

から集め先物

  • 表示データ+付加的な情報の結果を返すことによって、データの配列を作成します。私は2番目のステップを開始する前に戻った。私のコードは次の通りです:

    どのように私はそれを行うでしょうか?私は両方の先物が終了した後に呼び出されますか?

  • +0

    「ExecutorCompletionService」を見たいと思うかもしれませんが、応答があれば何かをすることができます。 – Gray

    +1

    http://stackoverflow.com/questions/3269445/executorservice-how-to-wait-for-all-tasks-to-finish – goat

    答えて

    7

    いくつかのオプションがあります。あなたが今あなたの要求をしたのと同じスレッドからdoStuffというコードを呼び出しました。両方のリクエストが完了するまでブロックする場合は、CountDownLatchを使用できます。ような何か:

    CountDownLatch responseWaiter = new CountDownLatch(2); 
    
    Future <HttpResponse<JsonNode>> future1 = Unirest.get("https://example.com/api").asJsonAsync(new Callback<JsonNode>() { 
        public void completed(HttpResponse<JsonNode> response) { 
        responses.put(response); 
        responseWaiter.countDown(); 
        } 
        ... 
    }); 
    
    // Similar code for the other get call 
    ... 
    
    responseWaiter.await(); 
    doStuff(responses); 
    

    あなたは両方の呼び出しが完了するまで、そのスレッドをブロックしたくない場合、あなたはあなたの匿名インナーコールバッククラスの各のAtomicIntegerをインクリメントする可能性があります。カウントが2の場合は、doStuffとします。何かのように:

    AtomicInteger numCompleted = new AtomicInteger(); 
    
    Future <HttpResponse<JsonNode>> future1 = Unirest.get("https://example.com/api").asJsonAsync(new Callback<JsonNode>() { 
        public void completed(HttpResponse<JsonNode> response) { 
        responses.put(response); 
        int numDone = numCompleted.incrementAndGet(); 
        if (numDone == 2) { 
         doStuff(responses); 
        } 
        } 
    }); 
    
    関連する問題