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

Ber*_*ric 9 java rest multithreading java-stream

我正在研究一些处理多个REST调用的java代码

call1()
call2()
call3()
...
Run Code Online (Sandbox Code Playgroud)

我希望并行化这些调用,但同步执行我的主代码.我用lamba和并行流做了一个POC:

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

list.parallelStream()
            .forEach(Runnable::run);
Run Code Online (Sandbox Code Playgroud)

你有其他解决方案吗?我还检查过使用来自Jersey客户端的异步调用,但这需要更多的代码更改.

ern*_*t_k 10

您正在寻找的只是异步运行您的呼叫.您可以使用CompletableFutures提交任务,然后等待它们完成:

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);
Run Code Online (Sandbox Code Playgroud)

这将提交所有任务(异步运行),然后等待每个任务完成运行.当发生这种情况时,该方法将返回.

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

ExecutorService es = Executors.newFixedThreadPool(10);
list.stream()
    .map(r -> CompletableFuture.runAsync(r, es))
     ...
Run Code Online (Sandbox Code Playgroud)

  • @BertrandCedric:可以"假设"您的外部REST调用可能不受CPU限制:给定的线程实际上需要很少的CPU周期,并且处于空闲状态(等待响应).例如:**想象**一个电话需要100毫秒.你的线程空闲花费90毫秒,实时计算花费10毫秒(JSON序列化等).因此,对于单个CPU秒,您可以有100个线程处于活动状态(100个线程*10毫秒= 1秒)并且实际上不会浪费时间.如果你有8个线程,你的CPU将工作8*10ms = 80ms并等待920其他ms.这是虚构的,但你明白了. (2认同)