Java : call an API 200 times in parallel with no return expected

标签 java parallel-processing executorservice

我想调用 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;

这是正确的做法吗?

最佳答案

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

ExecutorService es = Executors.newFixedThreadPool(200);

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

es.shutdown();

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

<小时/>

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

  1. 使用较小的线程池(!)
  2. 回收池...尽管这需要使用其他方法来等待任务完成。
<小时/>

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

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

关于Java : call an API 200 times in parallel with no return expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53555220/

相关文章:

android - Future.get 阻塞了吗?

java - PushBot 接收推送通知会导致应用程序在未运行时崩溃

java - 扫描仪未扫描所有字段?

java - 将动态 WHERE 子句传递给 Java/JDBC 中的函数的安全方法

c# - .Net 中的并行性是否可以接管 CPU 并可能拒绝为其他进程提供服务?

programming-languages - 多核处理器编程

parallel-processing - 在异步并行中使用 .then

Java ExecutorService 暂停/恢复特定线程

java - 用 Java 编写 Gnome 2 面板小程序

java - 在 Executors.withFixedSizePool 中创建固定大小的数据库连接