并行流就是把一个内容分成多个数据块,并用不同的线程分 别处理每个数据块的流。

Java 8 中将并行进行了优化,我们可以很容易的对数据进行并 行操作。

Stream API 可以声明性地通过 parallel()sequential() 在并行流与顺序流之间进行切换。

 Fork/Join 框架与传统线程池的区别
 
  采用 “工作窃取”模式(work-stealing): 当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线 程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。 相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的 处理方式上.在一般的线程池中,如果一个线程正在执行的任务由于某些原因 无法继续运行,那么该线程会处于等待状态.而在fork/join框架实现中,如果 某个子问题由于等待另外一个子问题的完成而无法继续运行.那么处理该子 问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程 的等待时间,提高了性能.
 

import java.util.concurrent.RecursiveTask;

public class ForkJoinCaculate extends RecursiveTask<Long> {

    private long start;
private long end; public ForkJoinCaculate(long start, long end) {
this.start = start;
this.end = end;
} private static final long THRESHOLD = 10000L; @Override
protected Long compute() {
long length = end - start; if(length < THRESHOLD) {
long sum = 0;
for (long i = start; i <= end; i++) {
sum +=i;
}
return sum;
} else {
long middle = (end + start) / 2; //中间位置
ForkJoinCaculate left = new ForkJoinCaculate(start,middle);
left.fork(); //拆分子任务,同时压入线程队列
ForkJoinCaculate right = new ForkJoinCaculate(middle+1,end);
right.fork();
return left.join() + right.join(); }
}
}
import org.junit.Test;

import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream; public class TestForkJoin { public long max = 1000000000L; /**
* 多线程fork Join 方式执行相加
*/
@Test
public void test01() {
Instant start = Instant.now();
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask<Long> task = new ForkJoinCaculate(0,max);
Long sum = pool.invoke(task);
System.out.println(sum);
Instant end = Instant.now();
System.out.println("耗时:" + Duration.between(start,end));
} /**
* 单线程普通for循环
*/
@Test
public void test02() {
Instant start = Instant.now();
long sum = 0L;
for (long i = 0; i <= max ; i++) {
sum += i;
} System.out.println(sum);
Instant end = Instant.now();
System.out.println("耗费时间为:" + Duration.between(start,end).toMillis());
} @Test
public void test03() {
System.out.println("java8 并行流"); Instant start = Instant.now(); long sum = LongStream.rangeClosed(0, max)
.parallel()
.reduce(Long::sum).getAsLong(); System.out.println(sum); Instant end = Instant.now(); System.out.println("执行耗时:" + Duration.between(start,end).toMillis());
} }
 
 
 

Java8新特性 并行流与串行流 Fork Join的更多相关文章

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

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

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

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

  3. JDK8--07:并行流与串行流

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

  4. 乐字节-Java8新特性-接口默认方法之Stream流(下)

    接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...

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

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

  6. java8新特性——并行流与顺序流

    在我们开发过程中,我们都知道想要提高程序效率,我们可以启用多线程去并行处理,而java8中对数据处理也提供了它得并行方法,今天就来简单学习一下java8中得并行流与顺序流. 并行流就是把一个内容分成多 ...

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

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

  8. java8新特性,使用流遍历集合

    在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...

  9. 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)

    方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...

随机推荐

  1. 【BZOJ2829】[SHOI2012]信用卡凸包(凸包)

    [BZOJ2829][SHOI2012]信用卡凸包(凸包) 题面 BZOJ 洛谷 题解 既然圆角的半径都是一样的,而凸包的内角和恰好为\(360°\),所以只需要把圆角的圆心弄下来跑一个凸包,再额外加 ...

  2. docker-compose.yml(3)

    ELK:version: '2' services: elasticsearch: build: context: elasticsearch/ volumes: - ./elasticsearch/ ...

  3. empty() 与 html("") 的区别

    empty,首先循环给后代元素移除绑定.清除jquery给此dom的cache,然后循环removeFirstChild. 而html(''),则是简单暴力的设置innerHTML = ''; 查看文 ...

  4. [BJOI2017]开车

    [BJOI2017]开车 直接做要用栈 修改?难以直接维护 统计边的贡献! len*abs(pre)pre表示前缀car-stop 修改时候,整个区间的pre+1或者-1 分块,块内对pre排序并打标 ...

  5. 洛谷P4362 贪吃的九头龙

    大意就是把一棵树的点染成m种颜色,其中1号点的颜色必须染恰好k个节点. 总代价是所有两端点颜色相同的边的边权. 求最小代价. 解:可以分为m == 2和m > 2两个题. m > 2时有代 ...

  6. AndroidS软件代码提示

    在用Eclipse时候,你可以进行设置,设置成不管你输入任何字母,都能进行代码的提示,在Android Studio中也可以 设置,而且比Eclipse设置来的简单.当然如果你觉得代码自动提示会降低你 ...

  7. JSP页面用<a>标签访问 Action 出错

    问题: JSP页面 <a href="/crud1/crud1/add.action" >添加</a> struts.xml 中: <package ...

  8. linux 内核代码结构

    1.ARM的核心代码保存在arch/arm目录下 2.ARM SoC core architecture code保存在arch/arm目录下 3.ARM SOC的周边外设模块的驱动保存在driver ...

  9. 使用 windows 下的 secureCRT 软件的 通过 sftp 上传和下载文件到远端 linux 设备

    secureCRT 按下ALT+P就开启新的会话进行ftp操作. 输入:help命令,显示该FTP提供所有的命令 pwd:  查询linux主机所在目录(也就是远程主机目录) lpwd: 查询本地目录 ...

  10. M1-SaltStack&Flask-Day4

    1.virtualenv 虚拟环境 2.virtualenv env1 -p= 解释器路径 3. 进入Scripts 执行activate 激活配置 4.执行deactivate 取消激活配置 2.1 ...