《Java高并发程序设计》学习 --6.4 并行流与并行排序

45 篇文章 0 订阅
Java 8中,可以在接口不变的情况下,将流改为并行流。这样,就可以很自然地使用多线程进行集合中的数据处理。
1)使用并行流过滤数据
考虑一个简单的案例,希望可以统计1~1000000内所有的质数的数量。首先,需要做一个质数判断的函数:
public class PrimeUtil {
    public static boolean isPrime(int number) {
        int tmp = number;
        if(tmp<2) {
            return false;
        }
        for(int i=2; Math.sqrt(tmp)>=i; i++) {
            if(tmp%i==0) {
                return false;
            }
        }
        return true;
    }
}
上述函数给定一个数字,如果这个数字是质数就返回true,否则返回false。
接着,使用函数式编程统计给定范围内所有的质数:
IntStream.range(1,100000).filter(PrimeUtil::isPrime).count();
上述代码首先生成一个1到100000的数字流。接着使用过滤函数,只选择所有的质数,最后进行数量统计。
上述代码是串行的,将它改造成并行计算非常简单,只需要将流并行化即可:
IntStream.range(1,100000).parallel.filter(PrimeUtil::isPrime).count();
上述代码中,首先parallel()方法得到一个并行流,接着,在并行流上进行过滤,此时,PrimeUtil.isPrime()函数会被多线程并发调用,应用于流中的所有元素。
2)从集合得到并行流
在函数式编程中,可以从集合得到一个流或者并行流。下面这段代码试图统计集合内所有学生的平均分:
List<Student> ss = new ArrayList<Student>();
double ave = ss.stream().mapToInt(s->s.score).average().getAsDouble();
从集合对象List中,我们使用stream()方法可以得到一个流。如果希望将这段代码并行化,则可以使用parallelStream()函数。
double ave = ss.parallelStream().mapToInt(s->s.score).average().getAsDouble();
可以看到,将原有的串行方式改造成并行执行是非常容易的。
3)并行排序
在Java 8中,可以使用新增的Arrays.parallelSort()方法直接使用并行排序。
比如,可以这样使用:
int[] arr = new int[1000000];
Arrays.parallelSort(arr);
除了并行排序外,Arrays中还增加了一些API用于数组中的数据的赋值,比如:
public static void setAll(int[] arr, IntUnaryOperator generator)
这是一个函数式味道很浓的接口,它的第2个参数是一个函数式接口。如果想给数组中每一个元素都附上一个随机值,可以这么做:
Random r = new Random();
Arrays.setAll(arr, r.nextInt());
以上过程是串行的。只要使用setAll()对应的并行版本,就可以将它执行在多个CPU上:
Random r = new Random();
Arrays.parallelSetAll(arr, r.nextInt());




注:本篇博客内容总结自《 Java 高并发程序设计》
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值