java - 我们可以提高除 java 8 并行流以外的列表的性能吗
问题描述
我必须通过调用返回 List 的 rest API 从某处转储数据。
首先,我必须从一个 rest api 中获取一些 List 对象。现在使用并行流并使用 forEach 遍历每个项目。
现在,对于每个元素,我必须调用其他一些 api 来获取再次返回列表的数据,并通过调用另一个 rest api 保存相同的列表。
对于第 1 步的 6000 条记录,这大约需要 1 小时。
我尝试如下:
restApiMethodWhichReturns6000Records
.parallelStream().forEach(id ->{
anotherMethodWhichgetsSomeDataAndPostsToOtherRestCall(id);
});
public void anotherMethodWhichgetsSomeDataAndPostsToOtherRestCall(String id) {
sestApiToPostData(url,methodThatGetsListOfData(id));
}
解决方案
parallelStream
有时会导致意外行为。它使用一个常见的ForkJoinPool
. 因此,如果您在代码的其他地方有并行流,它可能对长时间运行的任务具有阻塞性质。即使在同一个流中,如果某些任务很耗时,所有工作线程也会被阻塞。
关于这个stackoverflow的一个很好的讨论。在这里,您会看到一些分配特定任务的 ForkJoinPool 的技巧。
首先确保您的 REST 服务是非阻塞的。
您可以做的另一件事是通过提供-Djava.util.concurrent.ForkJoinPool.common.parallelism=4
给 JVM 来使用池大小。
推荐阅读
- java - 在java中使用递归查找数字的以2为底的对数
- java - 使用 java smartcardio 函数发送 APDU 命令以将数据写入智能卡读卡器
- matplotlib - Matplotlib 版本 3.3.0 导致 ft2font DLL ImportError
- c# - Xamarin Forms - 通过 API 连接到 Wordpress 的最佳方法
- android - 使用蓝牙麦克风录音
- javascript - 如何使用 JavaScript 在 contentEditable div 中插入自定义标签或图像?
- c++ - 如何为 std::vector 调整大小分配默认值
- node.js - 如何使用自定义 MongoDB 配置文件将副本集设置到 docker 容器
- amazon-web-services - 如何允许 AWS 跨账户用户创建和保留 RDS 快照?
- yaml - 如何使用来自 gitlab-ci.yml 的 curl 向 Slack 发送消息?