龙空技术网

java 8 新特性 并行和串行Stream流的效率对比

木子教程 400

前言:

现在小伙伴们对“java流的传递方式是并行还是串行”大体比较重视,你们都需要分析一些“java流的传递方式是并行还是串行”的相关知识。那么小编在网摘上网罗了一些有关“java流的传递方式是并行还是串行””的相关内容,希望各位老铁们能喜欢,朋友们快快来学习一下吧!

使用for循环,串行Stream流,并行Stream流来对5亿个数字求和。看消耗的时间。

public class Demo06 {private static long times = 50000000000L;private long start;        @Before    public void init() {        start = System.currentTimeMillis();    }        @After    public void destory() {        long end = System.currentTimeMillis();        System.out.println("消耗时间: " + (end - start));    }       // 测试效率,parallelStream 120    @Test    public void parallelStream() {        System.out.println("serialStream");        LongStream.rangeClosed(0, times)                    .parallel()                    .reduce(0, Long::sum);    }        // 测试效率,普通Stream 342    @Test    public void serialStream() {        System.out.println("serialStream");        LongStream.rangeClosed(0, times)            .reduce(0, Long::sum);    }       // 测试效率,正常for循环 421    @Test    public void forAdd() {        System.out.println("forAdd");        long result = 0L;        for (long i = 1L; i < times; i++) {             result += i;        }    }}

我们可以看到parallelStream的效率是最高的。

Stream并行处理的过程会分而治之,也就是将一个大任务切分成多个小任务,这表示每个任务都是一个操作。

parallelStream线程安全问题

解决parallelStream线程安全问题

// 并行流注意事项@Testpublic void parallelStreamNotice() {       ArrayList<Integer> list = new ArrayList<Integer>();    for (int i = 0; i < 1000; i++) {        list.add(i);    }        List<Integer> newList = new ArrayList<>();    // 使用并行的流往集合中添加数据    list.parallelStream()        .forEach(s -> {             newList.add(s);        });        System.out.println("newList = " + newList.size());}

运行效果:

newList = 903

我们明明是往集合中添加1000个元素,而实际上只有903个元素。

解决方法:

加锁、使用线程安全的集合或者调用Stream的 toArray() / collect() 操作就是满足线程安全的了。

标签: #java流的传递方式是并行还是串行