Java的并发编程模型中,有个Fork-Join框架,目的是将大的任务分解成小的任务进行计算,然后再把每个小任务的计算结果汇总。
Fork / Join 框架提供了两个可供继承的子类
1,RecursiveAction 用以分解没有计算结果的任务
2,RecursiveTask 用以分解有计算结果的任务
接下来计算一个1加到100的程序,体会一下Fork/Join框架的使用
首先定义一个任务类CountTask类,因为是要计算结果,因此继承RecursiveTask类,主要是实现其compute方法,这里设置的阀值THRESHOLD值为10,表示每个任务计算的加数的个数最多为10个,接下来就是将任务根据阀值分组,并对每个分组进行计算
package com.luchi.thread.forkAndJoin; import java.util.concurrent.RecursiveTask; public class CountTask extends RecursiveTask<Integer>{ private static final int THRESHOLD=10;//设置阀值 private int start; private int end; public CountTask(int start, int end) { super(); this.start = start; this.end = end; } @Override protected Integer compute() { // TODO Auto-generated method stub int sum=0; //看任务是不是在阀值以下 boolean canComputs=(end-start+1)<=THRESHOLD; if(canComputs){ for(int i=start;i<=end;i++){ sum+=i; } return sum; }else{ int size=end-start+1; int taskNum; if(size%THRESHOLD==0){ taskNum=size/THRESHOLD; }else{ taskNum=size/THRESHOLD+1; } for(int i=1;i<=taskNum;i++){ int groupBegin=start+(i-1)*THRESHOLD; int groupEnd=Math.min(groupBegin+THRESHOLD-1, end); CountTask childTask=new CountTask(groupBegin, groupEnd); childTask.fork(); int childCount=childTask.join(); sum+=childCount; } return sum; } } }
看一下测试程序TestForkAndJoin类,fork/join需要使用ForkJoinPool容器,这个容器负责执行每个task
package com.luchi.thread.forkAndJoin; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; public class TestForkAndJoin { public static void main(String[]args){ ForkJoinPool forkJoinPool=new ForkJoinPool(); CountTask task=new CountTask(1,100); Future<Integer> result=forkJoinPool.submit(task); try { System.out.println(result.get()); } catch (InterruptedException | ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
其实这个模型和FutureTask使用方法差不多,不同的是,FutureTask是单线程使用,而ForkJoinPool里面保持了一个ForkJoinTask数组用来保存多个任务,同时ForkJoinWorkerThread用来执行任务,我的理解就是ForkJoin框架提供了一个多线程的执行环境用来执行多个任务而已,而其join方法和其他地方的join方法相同
相关推荐
Java并发网文归并总结。Fork and join,比较详细
译文:Fork and Join: Java Can Excel at Painless Parallel Programming Too!(Fork and Join Java也可以轻松地编写并发程序)
Fork/Join例子
Java Fork-Join 论文 排序
fork join 框架 生产使用实例,可以直接修改配置,实现业务。
fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的性能;设计的目的是为了处理那些可以被递归拆分的任务。
全网第一篇通过图文介绍Fork/Join框架与CompleteableFuture的PPT
golang实现的Java ForkJoin框架(初始版本)
java Fork Join框架及使用,java自带的多线程框架,来处理多线程的问题
Java并发Fork-Join框架原理
介绍了ForkJoin并发框架,供有java基础者学习,工作配合使用,附件带有PPT,介绍并发与并行区别,和ForkJoin代码范例,资源来自网络,分享分享!
赠送jar包:eclipse-collections-forkjoin-7.1.2.jar; 赠送原API文档:eclipse-collections-forkjoin-7.1.2-javadoc.jar; 赠送源代码:eclipse-collections-forkjoin-7.1.2-sources.jar; 赠送Maven依赖信息文件:...
而 JDK 7 中将会加入的 Fork/Join 模式是处理并行编程的一个经典的方法。虽然不能解决所有的问题,但是在它的适用范围之内,能够轻松的利用多个 CPU 提供的计算资源来协作完成一个复杂的计算任务。通过利用 Fork/...
看了下Java Tutorials中的fork/join章节,整理下。 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的...
Fork/Join框架Package jsr166y是Java 7并行编程类的的初步版本(Preliminary versions of classes targeted for Java 7.)
1.ServerSocketChannel与SocketChannel通讯 2.java Fork/Join 与ThreadPool使用
jbpm分支fork & 聚合join 操作例子,可应用于会签操作。
Harrison 在 IFIP Performance 2015 接受的论文“Beyond the Mean in Fork-Join Queues: Efficient Approximation for Response-Time Tails”中提出的近似方法。 文件 main_example.m 中提供了如何使用脚本的示例,...
主要为大家详细介绍了Java通过Fork、Join来优化并行计算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下