测试例子
package com;
import java.util.stream.Stream;
public class App
{
public static void main( String[] args )
{
Stream.of("张三,","李四,","王五,","马六,").parallel().forEach(System.out::print);
System.out.println("\n______________________________________________");
Stream.of("张三,","李四,","王五,","马六,").parallel().forEachOrdered(System.out::print);
System.out.println("\n______________________________________________");
Stream.of("张三,","李四,","王五,","马六,").parallel().forEachOrdered(System.out::print);
}
}
首先对forEach来说,当stream为parallel的时候,它是并行处理多线程的,所以不能保证输出数据的顺序,但是处理数据的效率比较高。操作共享变量的时候,需要考虑线程安全的问题。
错误案例
package com;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class App
{
public static void main( String[] args )
{
List<Integer> list = new ArrayList<>();
IntStream.range(0,10000).parallel().forEach(item->list.add(item));}
}
代码修正
package com;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class App
{
public static void main( String[] args )
{
List<Integer> list = new ArrayList<>();
IntStream.range(0,10000).parallel().forEachOrdered(item->list.add(item));}
}
对于使用forEachOrdeed ,当stream 为parallel的时候,虽然是多个线程并行处理的。但是还是会按照他source原有的顺序输出的,底层是通过happensbefore原则保证了它的内存可见性。