我想调用 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 和内存来说都是昂贵的。如果您想更有效地执行此操作(就客户端资源而言):
- 使用较小的线程池(!)
- 回收池...尽管这需要使用其他方法来等待任务完成。
假设 REST 调用将转到另一个服务/进程,那么您可能可以启动比核心数量更多的线程,并让它们并行进行。然而,远程服务可能对其可以执行的同时请求数量有限制,因此 200 个请求很容易“备份”在服务器的输入队列中,可能导致请求超时、5xx 错误等。因此,一次发出 200 个请求不太可能有利于整体吞吐量。
如果您将此作为压力测试,则有更现实的方法可以做到这一点;请参阅@Karol 的回答。
关于Java : call an API 200 times in parallel with no return expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53555220/