并发是多个任务共享时间段(由CPU切换执行,就像是在同时执行)
    并行是多个任务发生在同一时刻(真真正正的同时执行)(必须在多核CPU下)
    并行就像用更多的马车(CPU)来拉货(执行任务),货物总量(任务量)一定,那么花费的时间自然减少了。
    所以并行可以缩短任务执行时间,提高多核CPU的利用率

    Java8并行流 - 图1

    • 多个任务可以并行处理,那么数据也是可以并行处理的
      数据并行是指把数据拆分成多个小单元,每个小单元再分配对应的处理单元。

    数据并行化:

    • Java5中我们可以采用concurrent库来实现数据并行
    • Java7我们可以采用forke/join 来实现
    • Java8 提供了对应的Api操作 所以实现了简单化流程

    代码实测效率对比

    1. public class ParalleStream {
    2. @Test//35592ms
    3. public void testFor() throws Exception {
    4. long start = System.currentTimeMillis();
    5. long sum = 0;
    6. for (long i = 0; i < 100000000000L; i++) {
    7. sum += i;
    8. }
    9. System.out.println(sum);
    10. long end = System.currentTimeMillis();
    11. System.out.println(end-start);
    12. }
    13. @Test//52974ms
    14. public void testStream() throws Exception {
    15. long start = System.currentTimeMillis();
    16. long sum = LongStream.rangeClosed(0, 100000000000L).sum();
    17. System.out.println(sum);
    18. long end = System.currentTimeMillis();
    19. System.out.println(end-start);
    20. }
    21. @Test//12808ms
    22. public void testParallelStream() throws Exception {
    23. long start = System.currentTimeMillis();
    24. Arrays.asList( 1,2,3 ).stream().parallel().forEach( e->{
    25. System.out.println(e);
    26. } );
    27. long sum = LongStream.rangeClosed(0, 100000000000L).parallel().sum();
    28. System.out.println(sum);
    29. long end = System.currentTimeMillis();
    30. System.out.println(end-start);
    31. }
    32. }
    • 应用场合
      1.处理的数据量足够大
      2.不止一个核 核数指的是 运行机器可以使用的cpu数量
      3.装箱 处理基本类型比装箱的速度要快
      4.数据结构 对于ArrayList 、InStream.range这些数据结构 处理速度要更快一点。对于处理HashSet、Treeset可能性能不是特别高、原因在于数据的接口后者在处理的时候不容易被分解