代码之家  ›  专栏  ›  技术社区  ›  Bertrand Cedric

并行REST调用的最佳方法是什么?

  •  9
  • Bertrand Cedric  · 技术社区  · 6 年前

    call1()
    call2()
    call3()
    ...
    

    我想并行化这些调用,但要同步执行主代码。

    List<Runnable> list = new ArrayList();
    list.add(() -> {call1()});
    list.add(() -> {call2()});
    list.add(() -> {call3()});
    list.add(...);
    
    list.parallelStream()
                .forEach(Runnable::run);
    

    你还有别的办法吗? 我还检查了使用来自Jersey客户端的异步调用,但这需要更多的代码更改。

    1 回复  |  直到 5 年前
        1
  •  11
  •   ernest_k    6 年前

    你想要的就是异步运行你的调用。你可以用 CompletableFuture s提交任务,然后等待它们完成:

    list.stream() //you don't really need a parallel stream
        .map(CompletableFuture::runAsync)
        .collect(Collectors.toList()) //make sure all tasks are submitted
        .stream()
        .forEach(CompletableFuture::join);
    

    您可能需要控制异步任务的线程池。这是一个使用10线程池的示例:

    ExecutorService es = Executors.newFixedThreadPool(10);
    list.stream()
        .map(r -> CompletableFuture.runAsync(r, es))
         ...