JDK8中,提供了并行流和串行流,使用parallel()和sequential()来处理,parallel()为并行流sequential()为串行流,两者可以相互转换,以最后一个为准

LongStream.rangeClosed(,).sequential().parallel().reduce((x,y)->x+y);

  以上代码示例就是并行流和串行流的使用,由于parallel在后,所以是以并行流运算。

  其实JDK8的并行流和串行流并不复杂,但是想要了解其历史,就要从单线程、多线程、JDK7的fork/join框架一一说起。

  首先说单线程问题,如果是单线程,肯定是没有多线程运行快的(通常情况下如此,如果仅此是1+1的操作,多线程因为线程切换等原因,反而会更慢),况且fork/join使用的是线程窃取模式进行处理的,相比多线程更有优势,可以更好的使用内存。

  但是为什么fork/join没有被大量使用呢,主要是因为fork/join写法太繁琐,下面就举例说明fork/join的写法

1、fork/join

首先创建一个ForkJoinDemo对象,对数据进行拆分(fork)运算后汇总(join)

package com.example.jdk8demo;

import java.util.concurrent.RecursiveTask;

public class ForkJoinDemo extends RecursiveTask<Long> {
private long start;
private long end;
private static final long mm = ; public ForkJoinDemo(long start,long end){
this.start = start;
this.end = end;
} @Override
protected Long compute() {
long length = end - start;
if(length <= mm){
long sum = ;
for (long i=start;i<= end;i++){
sum +=i;
}
return sum;
}else{
long mid = (start+end)/;
ForkJoinDemo left = new ForkJoinDemo(start,mid);
left.fork();
ForkJoinDemo right = new ForkJoinDemo(mid+,end);
right.fork();
return left.join() + right.join();
}
}
}

  测试方法:

public void test1(long num){
Instant start = Instant.now();
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Long> forkJoinTask = new ForkJoinDemo(,num);
long sum = forkJoinPool.invoke(forkJoinTask);
Instant end = Instant.now();
log.info("fork/join运行时间【{}】,运行结果【{}】",Duration.between(start,end).toMillis(),sum);
}

  可以发现使用fork/join的写法非常麻烦

JDK8提供的串行流和并行流的操作就非常方便

2、串行流

    public void test3(long num){
Instant start = Instant.now();
OptionalLong optionalLong = LongStream.rangeClosed(,num).sequential().reduce((x,y)->x+y);
Instant end = Instant.now();
log.info("串行流运行时间【{}】,运行结果【{}】",Duration.between(start,end).toMillis(),optionalLong.getAsLong());
}

3、并行流

    public void test4(long num){
Instant start = Instant.now();
OptionalLong optionalLong = LongStream.rangeClosed(,num).parallel().reduce((x,y)->x+y);
Instant end = Instant.now();
log.info("并行流运行时间【{}】,运行结果【{}】",Duration.between(start,end).toMillis(),optionalLong.getAsLong());
}

4、为了演示执行时间,再添加一个单线程测试

    public void test2(long num){
long sum = ;
Instant start = Instant.now();
for(int i=;i<=num;i++){
sum+=i;
}
Instant end = Instant.now();
log.info("单线程for循环运行时间【{}】,运行结果【{}】",Duration.between(start,end).toMillis(),sum);
}

5、测试

  由于都是数据的累加操作,因此多线程由于线程切换等原因,会造成比单线程执行慢的假象,为了排除这一假象,直接累加到20亿的运行时间作为参考

    @Test
public void test(){
long num = **10000L;
test1(num);
test3(num);
test4(num);
test2(num);
}

运行结果:

单线程运行了一分钟,还没有出结果

fork/join运行时间3899毫秒,串行流2081毫秒,并行流1532毫秒,可见性能提升还是非常明显的。

JDK8--07:并行流与串行流的更多相关文章

  1. 【Java8新特性】关于并行流与串行流,你必须掌握这些!!

    写在前面 提到Java8,我们不得不说的就是Lambda表达式和Stream API.而在Java8中,对于并行流和串行流同样做了大量的优化.对于并行流和串行流的知识,也是在面试过程中,经常被问到的知 ...

  2. Java8的新特性--并行流与串行流

    目录 写在前面 Fork/Join框架 Fork/Join框架与传统线程池的区别 传统的线程池 Fork/Join框架 Fork/Join框架的使用 Java8中的并行流 写在前面 我们都知道,在开发 ...

  3. Java8新特性 并行流与串行流 Fork Join

    并行流就是把一个内容分成多个数据块,并用不同的线程分 别处理每个数据块的流. Java 8 中将并行进行了优化,我们可以很容易的对数据进行并 行操作. Stream API 可以声明性地通过 para ...

  4. 三、并行流与串行流 Fork/Join框架

    一.并行流概念: 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流. java8中将并行进行了优化,我们可以很容易的对数据进行并行操作.Stream API可以声明性的通过pa ...

  5. Java8新特性 - 并行流与串行流

    并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流. Java8中将并行进行了优化,我们可以很容易的对数据进行并行操作.Stream API可以声明性地通过parallel()和 ...

  6. ForkJoin、并行流计算、串行流计算对比

    ForkJoin 什么是 ForkJoin ForkJoin 是一个把大任务拆分为多个小任务来分别计算的并行计算框架 ForkJoin 特点:工作窃取 这里面维护的都是双端队列,因此但其中一个线程完成 ...

  7. Silverlight并行下载与串行下载

    思路清晰后仅仅只需百来行代码便可轻松编写出一套完整的资源动态下载组件- SerialDownloader和ParallelDownloader,它们共用一个完成资源表,且串行下载集成了优先机制(Dow ...

  8. for循环与串行化、并行化Stream流性能对比

    第四章 并行化Stream流 关注公众号(CoderBuff)回复"stream"获取<Java8 Stream编码实战>PDF完整版. <Java8 Strea ...

  9. iOS:GCD理解1(同步-异步、串行-并行)

    1.并行-异步(ST1与ST2抢占资源) 1-1).获取 并行(全局)队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t queu ...

随机推荐

  1. Chisel3 - Wire & Reg

    https://mp.weixin.qq.com/s/Y26N5P4XOr5e3uyi5XQY-w   不同于Verilog,Chisel中Wire和Reg并不是数据类型,而是数据容器,作为数据的一个 ...

  2. Redis 入门到分布式 (四) 瑞士军刀Redis其他功能

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 目录: 慢查询 Pipeline 发布订阅 Bitmap(位图) HyperLogLog GEO 一.慢 ...

  3. Java实现背包问题

    1 问题描述 给定n个重量为w1,w2,w3,-,wn,价值为v1,v2,-,vn的物品和一个承重为W的背包,求这些物品中最有价值的子集(PS:每一个物品要么选一次,要么不选),并且要能够装到背包. ...

  4. java实现矩阵变换加密法

    一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下: 1.首先按行填入密钥串 ...

  5. java实现圆周率与级数

    ** 圆周率与级数** 圆周率 我国古代数学家对圆周率方面的研究工作,成绩是突出的.三国时期的刘徽.南北朝时期的祖冲之都在这个领域取得过辉煌战绩. 有了计算机,圆周率的计算变得十分容易了.如今,人们创 ...

  6. 用vue实现一个简单的时间屏幕

    前言 去年用了一个小的 app,叫做 一个木函,本来想着用来做动画优化就删掉了的,不过看到他有个时间屏幕的小工具,就点进去看了下,觉得挺好玩的,就想着能不能自己实现一下. ps: 闲话不多说,先上例子 ...

  7. 浅谈js运行机制

    前言 因为js的运行机制十分重要,理解起来也十分抽象,仍还是在这里做个记录,加深自己的记忆. 总之,希望本文的内容能够对您的学习或者工作有所帮助.另,如果有任何的错误或者不足请指正! 如何理解js单线 ...

  8. 纯正中文版本pi-star系统下载

    基于3.4.17修改(稳定,发热量少) 不支持RPI 4 a/b+ 完美支持树莓派0,1,2,3 默认刷好卡,启动已经设置好所有参数(选好TFT屏幕,调制解调器类型GPIO,打开了DMR服务器(460 ...

  9. .NET Core技术研究系列-索引篇

    随着.NET Core相关技术研究的深入,现在将这一系列的文章,整理到一个索引页中,方便大家翻阅查找,同时,后续也会不断补充进来. .NET Core技术研究-WebApi迁移ASP.NET Core ...

  10. UI 小白设计常用的Website

    网址 设计师导航网址(其实这个用好了,enough) 设计导航1 设计导航2 icon 阿里巴巴Iconfont flaticons icomoon Noun Project 图片(有时候就是灵魂) ...