Java8新特性JDK8之并行流parallelStream

Java新特性玩转JDK8之并行流parallelStream


为什么会有这个并行流?

  • 集合做重复的操作,如果使用串行执行会相当耗时,因此一般会采用多线程来加快, Java8的paralleStream用fork/join框架提供了并发执行能力

  • 底层原理

    • 线程池(ForkJoinPool)维护一个线程队列
    • 可以分割任务,将父任务拆分成子任务,完全贴合分治思想

stream和parallelStream区别

public class Main {
    public static void main(String[] args) {
        //顺序输出 123456789
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        numbers.stream().forEach(System.out::print);
        
        System.out.println();//换行
        
        //并行乱序输出 比如 658974132 此输出不固定
        List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        nums.parallelStream().forEach(System.out::print);
    }
}
``
### 问题

- paralleStream并行 是否一定比 Stream串行 快?
   - 错误,数据量少的情况,可能串行更快,ForkJoin会耗性能
- 多数情况下并行比串行快,是否可以都用并行?
   - 不行,部分情况会有线程安全问题,parallelStream里面使用的外部变量,比如集合一定要使用线程安全集合,不然就会引发多线程安全问题

<a name="fVQ7l"></a>
### 多线程安全问题

- 比如:对没有线程安全的List集合进行添加操作,会出现问题。
   - 代码
```java
public class Main {
    public static void main(String[] args) {
        for (int i=0;i<2;i++) {
            ArrayList<Integer> integers = new ArrayList<>();
            IntStream.range(0, 100).parallel().forEach(integers::add);
            System.out.println(integers);
        }
    }
}
  • 测试结果
    • null 值问题1.png
    • 直接报错2.png
  • 解决方案
    • 使用类 java.util.concurrent.CopyOnWriteArrayList 替代ArrayList3.png
    • 代码
public class Main {
    // 此时无任何异常
    public static void main(String[] args) {
        for (int i=0;i<2;i++) {
            CopyOnWriteArrayList<Integer> integers = new CopyOnWriteArrayList<>();
            IntStream.range(0, 100).parallel().forEach(integers::add);
            System.out.println(integers);
        }
    }
}




未经授权不得转载或转载请注明出处
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值