java - 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;
这是正确的方法吗?
解决方案
您的语法不正确。它应该是:
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
后shutdown
调用。
这种方法存在问题。您实际上是在创建一个包含 200 个线程的池,然后销毁线程(然后池关闭)。这在 CPU 和内存中都很昂贵。如果您想更有效地执行此操作(就客户端资源而言):
- 使用较小的线程池 (!)
- 回收池......尽管这将涉及使用其他方法来等待任务完成。
假设 REST 调用将发送到另一个服务/进程,那么您可能会启动比您拥有的内核更多的线程,并让它们并行进行。但是,远程服务可能对它可以执行的同时请求的数量有限制,因此这 200 个请求很容易在服务器的输入队列中“备份”,可能导致请求超时、5xx 错误等。因此,一次触发 200 个请求不太可能对整体吞吐量有好处。
如果您将其作为压力测试,还有更现实的方法可以做到;请参阅@Karol 的回答。
推荐阅读
- javascript - 传递函数的动态 id
- wpf - C# WPF 使用带有 Button.Tag 的多图像源 ControlTemplate
- jquery - 如何使用jQuery从下拉列表中获取所选值的ID
- c++ - 如何使用 std::chrono 库设置特定时间?
- json - 使用 Guzzle Laravel 访问嵌套的 Json 响应
- c# - Unity 中的类继承
- ios - 在 Swift 中返回相同的函数本身有什么用
- android - 使用graphview库的Android实时信号不流畅
- javascript - net::ERR_ABORTED 500 当使用 fetch POST to web
- python - 具有“任意”值的 QSlider(来自列表/数组)?