Java 并发性:需要同时进行 2 个 Web 服务调用 - 这是否正确?

Java Concurrency: Need to make 2 webservice calls simultaneously - is this correct?

我想同时对 2 个不同的服务进行网络调用。最后,我将 2 Response 个对象压缩到一个流中。我正在使用 Callable,但我不确定我是否以正确的方式处理此问题。好像我仍然会被第一个 get() 调用 Future 阻塞,对吧?有人可以告诉我我是否在正确的轨道上吗?这是我目前所拥有的:

// submit the 2 calls to the thread pool
ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
Future<Mono<Response<ProcessInstance>>> processFuture =
        executorService.submit(() -> getProcessInstances(processDefinitionKey, encryptedIacToken));
Future<Mono<Response<Task>>> taskFuture =
        executorService.submit(() -> getTaskResponses(processDefinitionKey, encryptedIacToken, 100, 0));

// get the result of the 2 calls
Optional<Tuple2<Response<ProcessInstance>, Response<Task>>> tuple;
try {
    Mono<Response<ProcessInstance>> processInstances = processFuture.get();
    Mono<Response<Task>> userTasks = taskFuture.get();
    tuple = processInstances.zipWith(userTasks).blockOptional();
} catch (InterruptedException e) {
    log.error("Exception while processing response", e);
    // Restore interrupted state...
    Thread.currentThread().interrupt();
    return emptyProcessResponseList;
} catch (ExecutionException e) {
    log.error("Exception while processing response", e);
    return emptyProcessResponseList;
}

您的代码将阻塞直到 processFuture 完成,然后它将阻塞直到 taskFuture 完成。

可调用对象将并行处理,因此您可以节省时间(假设线程池大小 >= 2)。

鉴于:您需要等到两个任务都完成。

如果processFuture先结束,您将立即掉线并等待taskFuture结束。如果 taskFuture 先结束,您将阻塞直到 processFuture 结束,但是 taskFuture.get() 调用将立即 return 因为该任务已完成。无论哪种情况,结果都是一样的。

可以 改用 CompletableFuture ,然后 CompletableFuture.allOf() 但是对于这么简单的事情,您已经可以正常工作了。另见 Waiting on a list of Future