使用lambda函数的Java并行化

使用lambda函数的Java并行化,java,lambda,parallel-processing,Java,Lambda,Parallel Processing,我有一个带有process()方法的对象数组,我想并行运行。我想尝试lambdas来实现并行化。所以我试了一下: Arrays.asList(myArrayOfItems).forEach(item->{ System.out.println("processing " + item.getId()); item.process(); }); 每个process()调用大约需要2秒钟。我注意到“并行化”方法仍然没有加速。似乎所有的东西都在序列化运行。ID按系列(顺序)打印

我有一个带有process()方法的对象数组,我想并行运行。我想尝试lambdas来实现并行化。所以我试了一下:

Arrays.asList(myArrayOfItems).forEach(item->{
    System.out.println("processing " + item.getId());
    item.process();
});
每个process()调用大约需要2秒钟。我注意到“并行化”方法仍然没有加速。似乎所有的东西都在序列化运行。ID按系列(顺序)打印,每次打印之间暂停2秒

也许我误解了什么。使用lambdas(希望以一种非常简洁的方式)并行执行此操作需要什么?

方法集合。forEach()只是对所有元素的迭代。它被称为内部迭代,因为它将如何迭代留给集合,但它仍然是对所有元素的迭代

如果您想要并行处理,您必须:

  • 从集合中获取并行流
  • 指定将在流上执行的操作
  • 如果需要的话,对结果做点什么
  • 您可以在这里阅读我解释的第一部分:

    方法集合。forEach()只是对所有元素的迭代。它被称为内部迭代,因为它将如何迭代留给集合,但它仍然是对所有元素的迭代

    如果您想要并行处理,您必须:

  • 从集合中获取并行流
  • 指定将在流上执行的操作
  • 如果需要的话,对结果做点什么

  • 您可以在这里阅读我解释的第一部分:

    要创建并行流,请调用集合上的操作
    .parallelStream


    要创建并行流,请对集合调用操作
    .parallelStream


    Lambdas本身并没有并行执行任何操作<代码>流s也可以这样做

    请看一下方法
    Collection#parallelStream
    ():

    但是,请注意,当它实际并行时,没有任何保证或控制。根据其文件:

    返回一个可能并行的流,该流将此集合作为其源。允许此方法返回顺序流

    原因很简单。你真的需要在你的集合中有大量的元素(比如数百万)来实现并行化,以获得真正的回报(或者做其他繁重的事情)。并行化带来的开销是巨大的。因此,如果该方法认为它会更快,那么它可能会选择使用顺序流

    在考虑使用并行性之前,您应该实际设置一些基准测试,以测试它是否有任何改进。有许多例子表明,人们只是盲目地使用它,而没有注意到他们实际上降低了性能。另见


    您可以使用
    流#isParallel
    ()检查
    流是否是并行的


    如果直接在流上使用
    Stream#parallel
    (),则会得到一个并行版本。

    Lambdas本身不会并行执行任何操作<代码>流
    s也可以这样做

    请看一下方法
    Collection#parallelStream
    ():

    但是,请注意,当它实际并行时,没有任何保证或控制。根据其文件:

    返回一个可能并行的流,该流将此集合作为其源。允许此方法返回顺序流

    原因很简单。你真的需要在你的集合中有大量的元素(比如数百万)来实现并行化,以获得真正的回报(或者做其他繁重的事情)。并行化带来的开销是巨大的。因此,如果该方法认为它会更快,那么它可能会选择使用顺序流

    在考虑使用并行性之前,您应该实际设置一些基准测试,以测试它是否有任何改进。有许多例子表明,人们只是盲目地使用它,而没有注意到他们实际上降低了性能。另见


    您可以使用
    流#isParallel
    ()检查
    流是否是并行的


    如果你直接在流上使用
    Stream#parallel
    (),你会得到一个并行版本。

    你的意思是
    .parallelStream().forEach(item->{..
    谢谢,parallelStream()解决了我的问题吗解决了我的问题我认为这将是最好的答案,尽管它有一个缺陷:当每个操作需要2秒时,它的实际回报远低于用户寻求流畅体验时的数百万。这是正确的。请注意,并行性带来了巨大的开销,你不应该盲目地在任何地方使用它我认为这是最好的答案,尽管它有一个缺陷:当每个操作花费2秒时,它的实际回报比用户寻求流畅体验时的数百万次操作要低得多。这是正确的。只需注意这会产生巨大的开销,你不应该盲目地在任何地方使用它,而不去考虑它或实际测量时间
    Arrays.asList(myArrayOfItems).parallelStream().forEach(item->{
        System.out.println("processing " + item.getId());
        item.process();
    });
    
    Arrays.asList(myArrayOfItems).parallelStream().forEach(...);