1、什么是Foirk/Join框架

Fork/Join框架是Java7提供用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

2、什么是并行流与顺序流

2.1  什么是并行流?

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

2.2  工作窃取模式

某个线程从其他队列里窃取任务来执行,

3、使用Fork/Join框架

/**
* 累加运算测试
*/
public class ForkJoinCalculate extends RecursiveTask<Long> { /**
*
*/
private static final long serialVersionUID = 7125244951292834932L; private long start;// 起始值
private long end;// 结束值
private static final long THRESHOLD = 10000L;// 临界值 @Override
protected Long compute() {
long length = end - start; if(length <= THRESHOLD) {
long sum = 0L; for (long i = start; i <= end; i++) {
sum += i;
} return sum;
}else {
long middle = (start + end) / 2;// 中间值 ForkJoinCalculate left = new ForkJoinCalculate(start, middle);// 0-50000000
left.fork();// 拆分子任务,同时压入线程队列
ForkJoinCalculate right = new ForkJoinCalculate(middle + 1, end);// 50000001-100000000
right.fork();// 拆分子任务,同时压入线程队列 return left.join() + right.join();// 汇总任务结果
}
} public ForkJoinCalculate() {
} public ForkJoinCalculate(long start, long end) {
this.start = start;
this.end = end;
}
}

4、Java8中的并行流和顺序流

4.1 顺序流

/**
* Java8的顺序流
*/
@Test
public void test3() {
Instant start = Instant.now();// java8中新时间日期API LongStream.rangeClosed(0, 10000000000L)
.sequential()// 顺序流
.reduce(0, Long::sum); Instant end = Instant.now(); // 5780
System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());// java8中新时间日期API
}

  

4.2  并行流

/**
* Java8的并行流
*/
@Test
public void test4() {
Instant start = Instant.now();// java8中新时间日期API LongStream.rangeClosed(0, 10000000000L)
.parallel()// 并行流
.reduce(0, Long::sum); Instant end = Instant.now(); // 2392
System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());// java8中新时间日期API
}

  

 

Java并发Fork-Join框架原理解析的更多相关文章

  1. Java并发——Fork/Join框架

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

  2. Java并发——Fork/Join框架与ForkJoinPool

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

  3. Java 7 Fork/Join 框架

    在 Java7引入的诸多新特性中,Fork/Join 框架无疑是重要的一项.JSR166旨在标准化一个实质上可扩展的框架,以将并行计算的通用工具类组织成一个类似java.util中Collection ...

  4. Java 7 Fork/Join 并行计算框架概览

    应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在 很多的应用程序在运行在多核 ...

  5. Java并发编程 Volatile关键字解析

    volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...

  6. Java的Fork/Join任务

    当我们需要执行大量的小任务时,有经验的Java开发人员都会采用线程池来高效执行这些小任务.然而,有一种任务,例如,对超过1000万个元素的数组进行排序,这种任务本身可以并发执行,但如何拆解成小任务需要 ...

  7. Java 并发:volatile 关键字解析

    摘要: 在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保 ...

  8. Java的Fork/Join任务,你写对了吗?

    当我们需要执行大量的小任务时,有经验的Java开发人员都会采用线程池来高效执行这些小任务.然而,有一种任务,例如,对超过1000万个元素的数组进行排序,这种任务本身可以并发执行,但如何拆解成小任务需要 ...

  9. Java Concurrency - Fork/Join Framework

    Normally, when you implement a simple, concurrent Java application, you implement some Runnable obje ...

  10. Java并发——ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式

    前言: 在刚学Java并发的时候基本上第一个demo都会写new Thread来创建线程.但是随着学的深入之后发现基本上都是使用线程池来直接获取线程.那么为什么会有这样的情况发生呢? new Thre ...

随机推荐

  1. 轻松配置httpd的虚拟主机

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  2. PHP常用字符串处理函数

    (1)strlen(string) 返回字符串长度 (2)strpos(string,find,begin) 返回find字符串第一次出现的位置(从0开始) string:处理的字符串 find:想找 ...

  3. Django进阶篇【1】

    注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...

  4. php获取音悦台视频

    <?php $url=isset($_GET['url'])?trim($_GET['url']):''; $url = "http://v.yinyuetai.com/video/6 ...

  5. java 虚拟机与并发处理几个问题简要(一)

    一.   处理任务时,应该将代码分成不同的部分,每一部分由一个线程进行,但是会因为任务负载不平衡导致有闲有忙.最好是应分成不同的部分,分配不同的线程,尽量让处理器不停的处理,不要闲下来.如何分配线程数 ...

  6. Winform常用的一些功能收集(持续更新)

    #region progressBar实时显示进度 private void button1_Click(object sender, EventArgs e) { int i = 10000; pr ...

  7. 实用的Jquery选项卡TAB

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. JSONP、图片Ping、XMLHttpRequest2.0等跨域资源请求(CORS)

    跨域:当协议.主域名.子域名.端口号中任意一个不相同时都不算同一个域,而在不同域之间请求数据即为跨域请求.解决方法有以下几种(如有错误欢迎指出)以请求图片url为例: 1.通过XMLHttpReque ...

  9. JavaScript设计模式--简单工厂模式例子---XHR工厂

    第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方法不要写出Interface.prototype ,因为这是写到接 ...

  10. php中各种定义变量的方法

      1.定义常量define("CONSTANT", "Hello world."); 常量只能包含标量数据(boolean,integer,float 和 s ...