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

时间:2018-09-20 07:10:39

标签: java multithreading rest java-stream

我正在处理一些Java代码,该代码可以处理多个REST调用

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

我想并行化这些调用,但是要同步执行我的主代码。 我用lamba和并行流制作了POC:

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

list.parallelStream()
            .forEach(Runnable::run);

您还有其他解决方案吗? 我还检查了是否使用来自Jersey客户端的异步调用,但这将需要更多代码更改。

1 个答案:

答案 0 :(得分:9)

您要寻找的只是异步运行您的呼叫。您可以使用CompletableFuture来提交任务,然后等待它们完成:

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))
     ...