使用lambda函数的Java并行化
我有一个带有process()方法的对象数组,我想并行运行。我想尝试lambdas来实现并行化。所以我试了一下:使用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按系列(顺序)打印
Arrays.asList(myArrayOfItems).forEach(item->{
System.out.println("processing " + item.getId());
item.process();
});
每个process()调用大约需要2秒钟。我注意到“并行化”方法仍然没有加速。似乎所有的东西都在序列化运行。ID按系列(顺序)打印,每次打印之间暂停2秒
也许我误解了什么。使用lambdas(希望以一种非常简洁的方式)并行执行此操作需要什么?方法集合。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(...);