複数の同時リクエストの最終完了を待つ方法がある
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??