【问题标题】:Can I have recursive function call inside parallel streams in java我可以在java中的并行流中进行递归函数调用吗
【发布时间】:2015-05-12 17:02:44
【问题描述】:

我有一个函数来为我的数据建模。 如果参数“Entity”包含 child,则它包含在子名称中。 有两种类型的孩子 Type-A 和 Type-B。 对于每种类型,函数都被递归调用。 当孩子没有更多的孩子名字时,这个递归函数调用退出。

public void modelMyData(Entity entity) {

    if (entity.getChildNames()[0] != null) {
        Arrays.stream(entity.getChildNames())
                .collect(Collectors.toList())
                .parallelStream()
                .forEach(childType -> {

                        entity.getChild(childType).parallelStream()
                                .forEach(child -> {
                                    modelMyData(child);

                                    });
                        ;
                    });
    }

    System.out.println("INSERT " + entity.getChildAttributeValue());

}

该程序对我来说很好。但是据说在java编程中使用并行流是不好的。

访问http://zeroturnaround.com/rebellabs/java-parallel-streams-are-bad-for-your-health/

我应该使用流而不是并行流吗?

【问题讨论】:

  • 进行性能测试,看看 parallelStream 在你的机器上是否会表现得更好
  • 我已经这样做了,并且流比并行流给了我更好的性能。这让我很困惑。
  • 所以使用纯流。如果您在处理或/和长时间运行的计算期间执行某种类型的 IO,您希望在内核之间进行并行化,那么并行流将非常有用。
  • @AkhilKKamal 如果您有本地 I/O,您可能会导致过多的非顺序访问,从而降低 HDD 和 SSD 的性能。

标签: java


【解决方案1】:

您是否在流中进行长时间运行的操作?如果是,使用parallelStream,如果不是,不要。你读过这篇文章吗?它指的是长时间运行操作期间的线程池耗尽。您的问题/程序是否属于这种情况?

顺便说一句,只需Arrays.asList(entity.getChildNames()).parallelStream()....,无需复制所有内容。

【讨论】:

  • 我的用例有 I/O 操作,所以建议我应该去并行流。
  • 您链接到的问题是关于基元数组的,但这不适用于您的情况,因为子名称是对象(您测试是否与 null 相等)
猜你喜欢
  • 2022-12-18
  • 1970-01-01
  • 2010-11-14
  • 2015-12-30
  • 1970-01-01
  • 2012-06-11
  • 2010-10-03
  • 1970-01-01
  • 2022-06-25
相关资源
最近更新 更多