ForkJoin框架
来源:互联网 发布:晋城网络电视台直播 编辑:程序博客网 时间:2024/06/04 18:06
ForkJoin 框架是Java7提供的用于并行执行任务的框架,是把一个大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的
框架。要想使用ForkJoin框架,必须首先创建一个ForkJoin任务,称之为ForkJoinTask,提供Fork和Join操作的机制,不需要直接继承
ForkJoinTask类,只需要继承它的子类。子类有两个:
RecursiveAction: 用于返回没有结果的任务
RecursiveTask:用于返回有结果的任务
ForkJoinPool:ForkJoinTask任务需要通过ForkJoinPool来执行
下面代码:以1+2+3+4 为例子
import java.util.concurrent.ForkJoinPool;import java.util.concurrent.Future;import java.util.concurrent.RecursiveTask;public class CountTask extends RecursiveTask<Integer>{ //阀值 用于两个数的相加 a+b private static final int THRESHOLD = 2; private int start; private int end; public CountTask(int start, int end){ this.start = start; this.end = end; } @Override protected Integer compute() { System.out.println("Come in "); int sum = 0; //如果任务足够小就计算任务 boolean canCompute = (end - start)<=THRESHOLD; if(canCompute) { for(int i = start ;i<=end ;i++) { sum += i; } } else { //如果任务大于阀值 就分裂成两个子任务进行计算 int middle = (start+end)/2; CountTask leftTask = new CountTask(start, middle); CountTask rightTask = new CountTask(middle+1, end); //执行子任务 leftTask.fork(); rightTask.fork(); //等待子任务自行完 并得到其结果 int leftResuklt = leftTask.join(); int rightResult = rightTask.join(); //合并子任务 sum = leftResuklt + rightResult; } return sum; } public static void main(String[] args) { ForkJoinPool forkJoinPool = new ForkJoinPool(); //生成一个计算任务 CountTask task = new CountTask(1,4); //执行一个任务 Future<Integer> result = forkJoinPool.submit(task); try { //检查任务是否已经抛出异常或者已经被取消了 if(task.isCompletedAbnormally()) { System.out.println(task.getException()); } System.out.println(result.get()); } catch (Exception e) { e.printStackTrace(); } }}
0 0
- ForkJoin框架
- ForkJoin框架(一):ForkJoin框架概述
- Java7 ForkJoin 框架
- 我是菜鸟:ForkJoin框架
- ForkJoin框架解析
- 多线程之ForkJoin框架
- ForkJoin框架的自我实现
- ForkJoin多核并行框架总结
- ForkJoin框架(二):ForkJoinTask
- ForkJoin框架示例(一)
- ForkJoin框架示例(二)
- ForkJoin
- ForkJoin
- forkjoin
- 6.执行器--并行编程框架 ForkJoin
- JAVA7 的ForkJoin框架-学习笔记
- ForkJoin框架的一些原理知识点
- java多线程之并行框架ForkJoin
- 读取、创建Json格式数据
- 文件的上传与下载
- hdu1465不容易系列之一
- Kaggle Titanic: Machine Learning from Disaster 一种思路
- Spring:关于ApplicationContext
- ForkJoin框架
- ffplay相关函数
- Problem N
- 【Educational Codeforces Round 10A】【简单讨论】Gabriel and Caterpillar 白天爬a晚上落b多久爬出洞
- 将USB启动镜像转换为SD卡启动代码解析
- MATLAB内的傅里叶变换
- Linux下如何进行FTP设置
- 如何利用Python库urllib2获取百度搜索引擎加密链接
- poj1609——Tiling Up Blocks