Java 并行化reduce操作
通过简单地将stream更改为parallelstream,是否可以将下面常见的“max”操作作为多核上的reduce操作分发?Java 并行化reduce操作,java,java-stream,Java,Java Stream,通过简单地将stream更改为parallelstream,是否可以将下面常见的“max”操作作为多核上的reduce操作分发? 不同线程的结果之间如何进行最终协调(没有显式组合器) List<Employee> emps = new ArrayList<>(); emps.add(new Employee("Roy1",32)); emps.add(new Employee("Roy2",12)); emps.add(new Employee("Roy3",22));
不同线程的结果之间如何进行最终协调(没有显式组合器)
List<Employee> emps = new ArrayList<>();
emps.add(new Employee("Roy1",32));
emps.add(new Employee("Roy2",12));
emps.add(new Employee("Roy3",22));
emps.add(new Employee("Roy4",42));
emps.add(new Employee("Roy5",52));
Integer maxSal= emps.parallelStream().mapToInt(e -> e.getSalary()).reduce((a,b)->Math.max(a, b)).getAsInt();
System.out.println("Maximum in parallel " + maxSal);
List emps=new ArrayList();
emps.add(新员工(“Roy1”,32));
EMP.add(新员工(“Roy2”,12));
EMP.add(新员工(“Roy3”,22));
EMP.add(新员工(“Roy4”,42));
EMP.add(新员工(“Roy5”,52));
整数maxSal=emps.parallelStream().mapToInt(e->e.getSalary()).reduce((a,b)->Math.max(a,b)).getAsInt();
System.out.println(“并行最大值”+maxSal);
是的,reduce
可以并行化。但是,这需要传递一个关联的运算符。摘自java.util.stream
JavaDoc:
结合性
如果满足以下条件,则运算符或函数op是关联的:
(a op b)op c==a op(b op c)
如果我们将其扩展到四个术语,就可以看出这对平行评估的重要性:
a op b op c op d == (a op b) op (c op d)
a op b op c op d==(a op b)op(c op d)
因此,我们可以并行计算(a op b)和(c op d),然后对结果调用op。
关联操作的示例包括数字相加、最小值和最大值以及字符串连接
如果操作(包括内部操作)具有良好的属性,那么并行化流是没有问题的。空气污染指数说(为了减少污染): […]正确构造的reduce操作本质上是可并行的, 只要用于处理元素的函数是 关联的和无状态的。[……] 并且(在文档中)有关联和无状态的定义: 无状态操作,如筛选和映射,不保留来自 以前在处理新元素时看到的元素--每个元素 可以独立于对其他元素的操作进行处理 及 如果以下条件成立,则运算符或函数op是关联的:
(a op b) op c == a op (b op c)
如果我们将其扩展到四个术语,就可以看出这对平行评估的重要性:
a op b op c op d == (a op b) op (c op d)
因此,我们可以并行计算(a op b)和(c op d),然后对结果调用op
粗略地说,如果操作是关联的和无状态的,这意味着您可以按照想要得到结果的任何顺序应用它。因此,任何好的泛型收集都可以应用。请记住,Java8流是基于Fork-Join池的,因此收集是众所周知的。有关该主题的教程介绍了基本知识:
if (my portion of the work is small enough)
do the work directly
else
split my work into two pieces
invoke the two pieces and wait for the results
在这种情况下,累加器和合并器是相同的,这是您的还原功能。但是您可以简单地调用
max()
而不是.reduce((a,b)->Math.max(a,b))
,得到相同的结果…