文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何进行JDK7新特性中fork/join框架的原理分析

2023-06-17 12:59

关注

如何进行JDK7新特性中fork/join框架的原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

原理解析:fork分解,join结合。这个框架的本质是将一个任务分解成多个子任务,每个子任务用单独的线程去处理。这里用到了递归的思想。框架的结构图可以参考

如何进行JDK7新特性中fork/join框架的原理分析

使用fork/join 框架很简单,

实现子问题的一般求解算法

如何分解问题

继承 RecursiveAction ,实现compute()方法

伪代码代码

  Result solve(Problem problem) {     if (problem is small)         directly solve problem     else {         split problem into independent parts         fork new subtasks to solve each part         join all subtasks         compose result from subresults     }

这里我通过一个改进的二分查找来讲解fork/join的使用。(后面才发现,选用这个案例是非常失败的,因为二分查找的时间是logn,而创建线程的开销更大,这样并不能体现多线程二分查找的优势,所以这个代码不具有实用性,只是为了说明如何使用框架:)

代码如下:

BinarySearchProblem.java

Java代码

package testjdk7;         import java.util.Arrays;         public class BinarySearchProblem {         private final int[] numbers;         private final int start;         private final int end;         public final int size;                  public BinarySearchProblem(int[] numbers,int start,int end){             this.numbers = numbers;             this.start = start;             this.end = end;             this.size = end -start;         }                  public int searchSequentially(int numberToSearch){            //偷懒,不自己写二分查找了            return Arrays.binarySearch(numbers, start, end, numberToSearch);         }                  public BinarySearchProblem subProblem(int subStart,int subEnd){             return new BinarySearchProblem(numbers,start+subStart,start+subEnd);         }     }

BiSearchWithForkJoin.java

Java代码

package testjdk7;     import java.util.concurrent.ForkJoinPool;     import java.util.concurrent.RecursiveAction;             public class BiSearchWithForkJoin extends RecursiveAction {         private final int threshold;         private final BinarySearchProblem problem;         public int result;         private final int numberToSearch;                  public BiSearchWithForkJoin(BinarySearchProblem problem,int threshold,int numberToSearch){             this.problem = problem;             this.threshold = threshold;             this.numberToSearch = numberToSearch;         }             @Override        protected void compute() {            if(problem.size < threshold){ //小于阀值,就直接用普通的二分查找                result = problem.searchSequentially(numberToSearch);            }else{                //分解子任务                int midPoint = problem.size/2;                BiSearchWithForkJoin left = new BiSearchWithForkJoin(problem.subProblem(0, midPoint),threshold,numberToSearch);                BiSearchWithForkJoin right = new BiSearchWithForkJoin(problem.subProblem(midPoint+1, problem.size),threshold,numberToSearch);                invokeAll(left,right);                result = Math.max(left.result, right.result);            }         }                  //构造数据         private static final int[] data = new int[1000_0000];         static{             for(int i = 0;i<1000_0000;i++){                 data[i] = i;             }         }         public static void main(String[] args){            BinarySearchProblem problem = new BinarySearchProblem(data,0,data.length);            int threshold = 100;            int nThreads = 10;            //查找100_0000所在的下标            BiSearchWithForkJoin  bswfj = new BiSearchWithForkJoin(problem,threshold,100_0000);            ForkJoinPool fjPool = new ForkJoinPool(nThreads);            fjPool.invoke(bswfj);            System.out.printf("Result is:%d%n",bswfj.result);         }                       }

RecursiveTask 还可以带返回值,这里给出一段代码作为参考(斐波那契函数)

(来自http://www.ibm.com/developerworks/cn/java/j-lo-forkjoin/index.html)

Java代码

class Fibonacci extends RecursiveTask {         final int n;             Fibonacci(int n) {             this.n = n;         }             private int compute(int small) {             final int[] results = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };             return results[small];         }             public Integer compute() {             if (n <= 10) {                 return compute(n);             }             Fibonacci f1 = new Fibonacci(n - 1);             Fibonacci f2 = new Fibonacci(n - 2);             System.out.println("fork new thread for " + (n - 1));             f1.fork();             System.out.println("fork new thread for " + (n - 2));             f2.fork();             return f1.join() + f2.join();         }     }

用途

只要问题能够分解成类似子问题的,都可以使用这个框架。对于大批量的数据尤其合适。

看完上述内容,你们掌握如何进行JDK7新特性中fork/join框架的原理分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯