首页 > 解决方案 > Java:并行调用 API 200 次,没有预期返回

问题描述

我想调用 REST API 200 次,但我不确定这样做是否正确:

ExecutorService es = Executors.newFixedThreadPool(200);

for (i = 0 ; i<200 ; i++) {
    if (check == true) {
        es.submit() -> callTrueAPI();
    } else {
        es.submit() ->callFalseAPI();
    }

    es.shutdown;

这是正确的方法吗?

标签: javaparallel-processingexecutorservice

解决方案


您的语法不正确。它应该是:

ExecutorService es = Executors.newFixedThreadPool(200);

for (int i = 0; i < 200; i++) {
    if (check) {
        es.submit(() -> callTrueAPI());
    } else {
        es.submit(() -> callFalseAPI());
    }
}

es.shutdown();

之后shutdown,线程池将继续运行,直到所有任务都完成。如果您想等到任务完成,请在调用awaitTerminationshutdown调用。


这种方法存在问题。您实际上是在创建一个包含 200 个线程的池,然后销毁线程(然后池关闭)。这在 CPU 和内存中都很昂贵。如果您想更有效地执行此操作(就客户端资源而言):

  1. 使用较小的线程池 (!)
  2. 回收池......尽管这将涉及使用其他方法来等待任务完成。

假设 REST 调用将发送到另一个服务/进程,那么您可能会启动比您拥有的内核更多的线程,并让它们并行进行。但是,远程服务可能对它可以执行的同时请求的数量有限制,因此这 200 个请求很容易在服务器的输入队列中“备份”,可能导致请求超时、5xx 错误等。因此,一次触发 200 个请求不太可能对整体吞吐量有好处。

如果您将其作为压力测试,还有更现实的方法可以做到;请参阅@Karol 的回答。


推荐阅读