当前位置: 首页 > 知识库问答 >
问题:

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

哈雅珺
2023-03-14

我想同时对2个不同的服务进行Web调用。最后,我将2个响应对象压缩到一个流中。我正在使用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;
}

共有2个答案

裴成文
2023-03-14

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

这些可调用项将被并行处理,因此在这里您可以节省时间(假设线程池大小

翟宏放
2023-03-14

给定:您需要等到两个任务都完成。

如果先结束processFuture,您将立即失败并等待直到taskFuture结束。如果taskFuture首先结束,您将一直阻止,直到processFuture结束,但是taskFuture。get()调用将在任务完成后立即返回。无论哪种情况,结果都是一样的。

您可以使用CompletableFuture,然后使用CompletableFuture。allOf()但对于这样简单的东西,您所拥有的一切都很好。另请参见等待未来的列表

 类似资料:
  • 问题内容: 这两个块之间会有性能差异吗? 与 两者之间还有其他考虑或建议吗? 问题答案: 好吧,在第二种情况下,编译后的代码可能包含两次强制转换-因此 ,从理论上讲, 它两次执行相同的工作。但是,智能JIT很可能会得出您对相同的值执行相同的强制转换,因此可以缓存结果。但它 是 不得不做的工作至少一次- 毕竟,它需要做出决定是否允许投成功,或抛出异常。 与以往一样,如果您关心性能,则应该测试和分析代

  • 问题内容: 在以下简单场景中: x是否需要挥发?我知道同步保证了原子性,但是我不确定可见性…是否执行锁->修改->解锁->锁保证,第二个锁之后x的值将为“新鲜”? 问题答案: 不,不是,已 同步 已在其后插入了内存屏障,因此考虑到其他线程将在同一锁上进行同步,所有线程将看到当前线程执行的更新。 就像同步的一样,易失性具有附加的内存屏障-根据CPU的不同,它是存储/加载/完全屏障,可确保一个线程的更

  • 假设我有一组从客户机发送到服务器的请求ID。服务器的响应返回我发送的请求ID,然后我可以将其从哈希集中删除。这将以多线程的方式运行,因此多个线程可以在哈希集中添加和删除ID。然而,由于生成的ID是唯一的(从线程安全的源代码,比如现在的,它会针对每个新请求进行更新),是否需要是? 我认为这可能导致问题的唯一情况是遇到冲突,这可能需要对底层对象进行数据结构更改,但在这个用例中似乎不会发生这种情况。

  • 问题内容: 如果仅在输出流中调用,则可以保证输出,还是需要始终调用? 问题答案: Close()始终刷新,因此无需调用。 编辑:这个答案是基于常识和我遇到的所有输出流。谁将为缓冲流实现close()而不先刷新缓冲区?在close()之前立即调用flush没有什么害处。但是,如果过度调用flush()会导致后果。它可能会在缓冲机制下失败。

  • 问题内容: 是否需要进行显式的if(log.isDebugEnabled()){…}检查? 我的意思是,我已经看到一些帖子提到log.debug(“something”)进行隐式调用,以查看调试模式日志记录是否已启用,然后再进行日志记录。我是否缺少某些东西,或者在使用此步骤之前有中间步骤要执行? 谢谢! 与 编辑:在上面写过:http : //java.sg/whether-to-do-a-isd

  • 问题内容: 会隐式调用吗? 如果可以,可以安全删除下面的代码片段吗? ps。我在官方文件中看不到任何描述: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html https://docs.oracle.com/javase/8/docs/api/java/lang/Au​​toClose