複数の同時リクエストの最終完了を待つ方法がある

1388 ワード

public List decorateRssItemsWithLinkImages(List rssItems) {
      ArrayList apodItems = new ArrayList<>(rssItems.size());
      final CountDownLatch fetchLinkLatch = new CountDownLatch(rssItems.size());
      for (RssItem rssItem : rssItems) {
        final ApodItem apodItem = new ApodItem();
        apodItem.rssItem = rssItem;
        fetchLinkPage(rssItem.link, new PageScrapedCallback() {
          @Override
          public void onPageScraped(@Nullable List imageUrls) {
            apodItem.largeImageUrl = imageUrls != null && !imageUrls.isEmpty()
                ? imageUrls.get(0)
                : null;
            fetchLinkLatch.countDown();
          }
        });
        apodItems.add(apodItem);
      }

      // Wait for all link fetches to complete, despite running them in parallel...
      Util.awaitUninterruptibly(fetchLinkLatch);

      return apodItems;
    }

1つのデッドサイクルでカウンタがcountDonwが0になったかどうかをチェックし、0になった場合、すべての同時タスクがすべて完了したことを示すと、デッドサイクルは終了します.
public static void awaitUninterruptibly(CountDownLatch latch) {
    while (true) {
      try {
        latch.await();
        return;
      } catch (InterruptedException e) {
        // Keep going...
      }
    }
  }

考えてみてください.他に合併を制御する方法はありませんか.AtomInteger??