首页 > 解决方案 > 如何在 Spring Boot 中编写 CompletableFuture supplyAsync(在 for 循环中调用)?

问题描述

我有一个 for 循环来根据 for 循环的增量发起请求。

List<String> listModel = new ArrayList<>();
for(int i=0;i<5;i++)
{
    String resp = initiateRequest(i);
    listModel.add(resp);
}

public String initiateRequest(int i)
{
   String url = String.format("http://api.github.com/"+i);
   String response = restTemplate.getForObject(url);
   return response;
}

想要将其转换为 CompletableFuture Async。

标签: spring-bootfor-loopasynchronouscompletable-future

解决方案


您可以使用IntStream进行迭代,然后使用CompletableFuture.supplyAsync进行异步请求

并使用CompletableFuture.allOf等到所有未来对象都完成

 CompletableFuture<String>[] futures = IntStream.range(0,5).mapToObj(i->CompletableFuture.supplyAsync(()->this.initiateRequest(i)))
            .toArray(CompletableFuture[]::<String>new);

    CompletableFuture.allOf(futures).join();

附带说明CompletableFuture.supplyAsync,默认情况下使用分叉连接池,并且它对其旋转的线程有一些限制


推荐阅读