返回顶部
首页 > 资讯 > 精选 >如何进行JDK7新特性中fork/join框架的原理分析
  • 366
分享到

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

2023-06-17 12:06:03 366人浏览 八月长安
摘要

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

如何进行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框架的原理分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何进行JDK7新特性中fork/join框架的原理分析

本文链接: https://lsjlt.com/news/289229.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何进行JDK7新特性中fork/join框架的原理分析
    如何进行JDK7新特性中fork/join框架的原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。原理解析:fork分解,join结合。这个框架的本质是将一个任务分解成多个...
    99+
    2023-06-17
  • 如何分析Java的Fork/Join并发框架
    这篇文章将为大家详细讲解有关如何分析Java的Fork/Join并发框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。今天我就把自己对Fork/Join一些浅显的理解记录下来。1. Fork...
    99+
    2023-06-17
  • 如何进行Redis5新特性中Streams作消息队列的分析
    这期内容当中小编将会给大家带来有关如何进行Redis5新特性中Streams作消息队列的分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言Redis 5 新特性中,S...
    99+
    2024-04-02
  • 如何进行Java Mybatis中的Mapper原理分析
    如何进行Java Mybatis中的Mapper原理分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。准备1.pom文件 <depen...
    99+
    2023-06-26
  • 如何进行Fedora 16的原理分析
    如何进行Fedora 16的原理分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、Fedora 16 主要特色Fedora 16,代号“Verne”,正式版本将于201...
    99+
    2023-06-16
  • 如何进行jQuery源码的整体框架分析
    这篇文章将为大家详细讲解有关如何进行jQuery源码的整体框架分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。先附上jQuery的代码结构。JS代码(fu...
    99+
    2024-04-02
  • 如何进行Spring AOP框架实现的结构分析
    如何进行Spring AOP框架实现的结构分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。从实现的角度来认识SpringAOP框架。观察的角度:从外部接口,内部实现,组成部分...
    99+
    2023-06-17
  • 如何进行nGrinder原理分析及性能工具对比
    这篇文章的内容主要围绕如何进行nGrinder原理分析及性能工具对比进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!在介绍nGrinder之前,有必要...
    99+
    2023-06-05
  • 如何在 Go 框架中使用 NumPy 存储进行数据分析?
    在数据科学领域,NumPy 是一个重要的 Python 库,它提供了高效的多维数组操作和数学函数。而 Go 语言作为另一种常用的编程语言,也有其自己的优点。本文将介绍如何在 Go 框架中使用 NumPy 存储进行数据分析,帮助您更好地利用这...
    99+
    2023-08-14
    框架 numpy 存储
  • 如何进行C#实现AOP微型框架基础的分析
    如何进行C#实现AOP微型框架基础的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在向大家详细介绍C#实现AOP微型框架之前,首先让大家了解下微型框架的.cs文件,然后全面...
    99+
    2023-06-17
  • 如何进行iOS 容器化框架的基本思路分析
    这期内容当中小编将会给大家带来有关如何进行iOS 容器化框架的基本思路分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言由本章节开始,我们将从支付宝客户端的架构设计方案入手,细分拆解客户端在“容器化框...
    99+
    2023-06-05
  • 如何进行gopher-lua虚拟机的原理分析
    这篇文章将为大家详细讲解有关如何进行gopher-lua虚拟机的原理分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在 GitHub 玩耍时,偶然发现了gopher-lua ,这是一个纯 ...
    99+
    2023-06-16
  • 如何用XGBoost在Python 中进行特征重要性分析和特征选择
    如何用XGBoost在Python 中进行特征重要性分析和特征选择,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用诸如梯度增强之类的决策树方法的集成的好处是,...
    99+
    2023-06-15
  • 如何进行AfterCodecs for Mac破解版的原理分析
    这篇文章给大家介绍如何进行AfterCodecs for Mac破解版的原理分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。AfterCodecs for Mac是一款本地AE/PR/ME视频编码加速输出渲染插件,最...
    99+
    2023-06-02
  • PyTorch中如何进行模型的解释性分析
    PyTorch提供了多种方法来进行模型的解释性分析,以下是一些常用的方法: 特征重要性分析:可以使用SHAP(SHapley A...
    99+
    2024-03-05
    PyTorch
  • 如何进行java面向对象编程原理的分析
    这期内容当中小编将会给大家带来有关如何进行java面向对象编程原理的分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java 的核心是面向对象编程。事实上,所有的Java 程序都是面向对象的,你别无选择...
    99+
    2023-06-03
  • 如何进行HTML5中手势原理分析与数学知识的实践
    本篇文章为大家展示了如何进行HTML5中手势原理分析与数学知识的实践,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。引言在这触控屏的时代,人性化的手势操作已经深入了我...
    99+
    2024-04-02
  • 如何进行基于代理的防火墙安全性分析
    本篇文章为大家展示了如何进行基于代理的防火墙安全性分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。其实一直以来,基于代理的防火墙或Web代理都被认为是一种非常重要的安全组件。但问题就在于,这种类型...
    99+
    2023-06-17
  • 如何进行webpack中bundle.js运行单步调试的原理解析
    本篇文章为大家展示了如何进行webpack中bundle.js运行单步调试的原理解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我这里可以在回顾一下这个web pack的hello world项目...
    99+
    2023-06-04
  • 如何使用Java分布式框架中的Shell进行快速开发?
    Java分布式框架中的Shell是一个非常强大的工具,可以帮助开发者快速开发出分布式应用程序。本文将介绍如何使用Java分布式框架中的Shell进行快速开发。 一、什么是Java分布式框架中的Shell? Java分布式框架中的Shell是...
    99+
    2023-08-18
    分布式 框架 shell
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作