java8 并发_java8 stream 并发

先随便写个代码打印1o个随机数,顺便加上parallel

package com.stream;

import java.util.List;

import java.util.stream.Collectors;

import java.util.stream.Stream;

public class TestStream7 {

public static void main(String args[]){

List results = Stream.generate(Math::random).filter(i->i<1).limit(10).map(i->i*100).map(Double::intValue).collect(Collectors.toList());

System.out.println(results);

List results2 = Stream.generate(Math::random).parallel().filter(i->i<1).limit(10).map(i->i*100).map(Double::intValue).collect(Collectors.toList());

System.out.println(results2);

}

}

与parallel方法对应的串行化方法叫做sequential

并行流的内部使用了ForkJoinPool, 它默认的线程数实际上是你的处理器内核数,这个值是由Runtime.getRuntime().availableProcessors()得到的

如果你确实想改变这个数值,可以使用

System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism","10");

来设置一个全局变量,不过要注意的是,它会影响所有的并行流,这里其实完全没有必要修改它,反正你也没有多余的cpu内核,反而会增加线程调度消耗

这里我们简单做个测试

package com.stream;

import java.util.Date;

import java.util.List;

import java.util.stream.Collectors;

import java.util.stream.Stream;

public class TestStream7 {

public static void main(String args[]){

Long s1 = new Date().getTime();

List results = Stream.generate(Math::random).filter(i->i<1).limit(100).map(i->i*100).map(Double::intValue).collect(Collectors.toList());

Long e1 = new Date().getTime();

System.out.println(e1-s1);

System.out.println(results);

Long s2 = new Date().getTime();

List results2 = Stream.generate(Math::random).parallel().filter(i->i<1).limit(100).map(i->i*100).map(Double::intValue).collect(Collectors.toList());

Long e2 = new Date().getTime();

System.out.println(e2-s2);

System.out.println(results2);

}

}

运行几次

次数

串行调用

并行调用

1

85

9

2

51

7

3

49

7

4

50

7

可以看到并行方式还是比较快的 ( 我当前环境是4核的i7处理器)

既然是多线程,我们就不能避免讨论一下线程安全的问题,使用parallel需要注意线程安全么? 答案是 当然需要,下面是一个线程不安全的例子

package com.stream;

import java.util.Optional;

import java.util.stream.Stream;

public class TestStream8 {

int total = 0;

public static void main(String args[]){

TestStream8 ts = new TestStream8();

Optional sum = Stream.of(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15).reduce(Integer::sum);

System.out.println(sum);

Stream.of(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15).parallel().forEach(ts::add);

System.out.println(ts.total);

}

public void add(int i){

total+=i;

}

}

这个程序多运行几次就会出现串行化结果是120, 并行是119(其实不一定是多少,看心情)的情况

282c8b48cb2de71c7deab82cc9df9caa.png

改成静态方法调用也是一样 (如果你了解哪些变量可以是线程不安全的,这很好理解)

d31c27cef37e44f37d22dc089a38ef87.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值