Java并发Fork-Join框架原理解析
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框架原理解析的更多相关文章
- Java并发——Fork/Join框架
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...
- Java并发——Fork/Join框架与ForkJoinPool
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...
- Java 7 Fork/Join 框架
在 Java7引入的诸多新特性中,Fork/Join 框架无疑是重要的一项.JSR166旨在标准化一个实质上可扩展的框架,以将并行计算的通用工具类组织成一个类似java.util中Collection ...
- Java 7 Fork/Join 并行计算框架概览
应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在 很多的应用程序在运行在多核 ...
- Java并发编程 Volatile关键字解析
volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...
- Java的Fork/Join任务
当我们需要执行大量的小任务时,有经验的Java开发人员都会采用线程池来高效执行这些小任务.然而,有一种任务,例如,对超过1000万个元素的数组进行排序,这种任务本身可以并发执行,但如何拆解成小任务需要 ...
- Java 并发:volatile 关键字解析
摘要: 在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保 ...
- Java的Fork/Join任务,你写对了吗?
当我们需要执行大量的小任务时,有经验的Java开发人员都会采用线程池来高效执行这些小任务.然而,有一种任务,例如,对超过1000万个元素的数组进行排序,这种任务本身可以并发执行,但如何拆解成小任务需要 ...
- Java Concurrency - Fork/Join Framework
Normally, when you implement a simple, concurrent Java application, you implement some Runnable obje ...
- Java并发——ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式
前言: 在刚学Java并发的时候基本上第一个demo都会写new Thread来创建线程.但是随着学的深入之后发现基本上都是使用线程池来直接获取线程.那么为什么会有这样的情况发生呢? new Thre ...
随机推荐
- 【重点突破】——使用Express创建一个web服务器
一.引言 在自学node.js的过程中有一个非常重要的框架,那就是Express.它是一个基于NodeJs http模块而编写的高层模块,弥补http模块的繁琐和不方便,能够快速开发http服务器.这 ...
- ora-01440:要减小精度或标度,则要修改的列必须为空
--由于业务需求变更,需要对oracle数据库productinfo表的productPrcie结构进行修改.修改表结构,必须是在表空的情况下才可以修改表结构.具体操作步骤: --1.查看produc ...
- 史上最难的一道Java面试题 (分析篇)
博客园 匠心零度 转载请注明原创出处,谢谢! 无意中了解到如下题目,觉得蛮好. 题目如下: public class TestSync2 implements Runnable { int b = 1 ...
- 【转载】基于vw等viewport视区相对单位的响应式排版和布局
文章转载自 张鑫旭-鑫空间-鑫生活 http://www.zhangxinxu.com/wordpress/ 原文链接:http://www.zhangxinxu.com/wordpress/?p=5 ...
- git 修改commit日期为之前的日期
我在之前修改了一个文件,但是没有commit,现在我想要commit,日期为那天的日期 git commit --date="月 日 时间 年 +0800" -am "提 ...
- Sping AOP初级——入门及简单应用
在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是和业 ...
- oracle 表空间不足解决办法
问题:在对某一表空间进行新建表的时候,出现ora-01658的错误. create 语句: create table OA_ORGCONFIG( OAOC_UNID INTEGER not ...
- LeetCode 216. Combination Sum III (组合的和之三)
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- LeetCode 122. Best Time to Buy and Sell Stock II (买卖股票的最好时机之二)
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- 【20171026早】alert(1) to win - 第六、七、八题
早上7点起床,又写了一篇小说发在了起点网上,有兴趣的可以看看.点击这里 忙完后,继续练习,刚开始发现自己答题的速度有些慢,可能是因为对于html,javascript知识不是很精通,但是话又说回来,谁 ...