如何进行JDK7新特性中fork/join框架的原理分析
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,如何进行JDK7新特性中fork/join框架的原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。原理解析:fork分解,join结
千家信息网最后更新 2025年01月22日如何进行JDK7新特性中fork/join框架的原理分析
如何进行JDK7新特性中fork/join框架的原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
原理解析:fork分解,join结合。这个框架的本质是将一个任务分解成多个子任务,每个子任务用单独的线程去处理。这里用到了递归的思想。框架的结构图可以参考
使用fork/join 框架很简单,
1.实现子问题的一般求解算法
2.如何分解问题
3.继承 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; /** * @author kencs@foxmail.com */ 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; /** * @author kencs@foxmail.com */ 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框架的原理分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
代码
框架
问题
任务
原理
方法
线程
特性
分析
个子
内容
数据
更多
参考
合适
实用
普通
束手无策
为此
下标
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
北京跃动网络技术有限公司
保护网络安全的建议
vps服务器试用7天
服务器直接访问授权页
学校网络安全管理记录本内容
软件开发专业技能活动
私人网络安全管理制度
数据库可以查找信息吗
医院网络安全 ppt
网络安全与电竞
网络安全知识都有哪些内容
新加坡软件开发公司排名
华为云服务器传输文件
数据库诗句
软件开发测试收费
网络安全社会协同治理
hmcl怎么玩租赁服务器
中国银行软件开发offer
怀旧服60级人最多的服务器
django 视频服务器
塔城互联网科技行情
aws国外云服务器测速
c 数据库查询表达式
云桌面服务器软件主要有哪些
方舟服务器倍率查询
杭州同欣网络技术有限公司家具
文件能上传数据库吗
汤姆视频软件开发
免费数据库什么最好
ebsco数据库高级检索