首页 > 解决方案 > 我们可以提高除 java 8 并行流以外的列表的性能吗

问题描述

我必须通过调用返回 List 的 rest API 从某处转储数据。

  1. 首先,我必须从一个 rest api 中获取一些 List 对象。现在使用并行流并使用 forEach 遍历每个项目。

  2. 现在,对于每个元素,我必须调用其他一些 api 来获取再次返回列表的数据,并通过调用另一个 rest api 保存相同的列表。

  3. 对于第 1 步的 6000 条记录,这大约需要 1 小时。

我尝试如下:

restApiMethodWhichReturns6000Records
    .parallelStream().forEach(id ->{
       anotherMethodWhichgetsSomeDataAndPostsToOtherRestCall(id);
                       });


public void anotherMethodWhichgetsSomeDataAndPostsToOtherRestCall(String id) {

     sestApiToPostData(url,methodThatGetsListOfData(id));
}

标签: javamultithreadingparallel-processingstreamjava-stream

解决方案


parallelStream有时会导致意外行为。它使用一个常见的ForkJoinPool. 因此,如果您在代码的其他地方有并行流,它可能对长时间运行的任务具有阻塞性质。即使在同一个流中,如果某些任务很耗时,所有工作线程也会被阻塞。

关于这个stackoverflow的一个很好的讨论。在这里,您会看到一些分配特定任务的 ForkJoinPool 的技巧。

首先确保您的 REST 服务是非阻塞的。

您可以做的另一件事是通过提供-Djava.util.concurrent.ForkJoinPool.common.parallelism=4给 JVM 来使用池大小。


推荐阅读