Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并行化reduce操作_Java_Java Stream - Fatal编程技术网

Java 并行化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));

通过简单地将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));
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))
,得到相同的结果…