首页 / 算法 / Fork/Join 归并算法
Fork/Join 归并算法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Fork/Join 归并算法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2963字,纯文字阅读大概需要5分钟。
内容图文
![Fork/Join 归并算法](/upload/InfoBanner/zyjiaocheng/840/7d91bc6e774e4372910c10e0e26f0493.jpg)
Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,一个把大任务分割成多个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join框架要完成两件事情:
1.任务分割:首先Fork/Join框架需要把大的任务分割成小的子任务,若子任务比较大的话还要对子任务进行继续分割
2.执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里,启动一个线程从队列里取数据,然后合并这些数据。
使用:
1.首先需要创建一个ForkJoin任务。该类提供了在任务中执行fork和join的机制。通常情况下我们不需要直接继承ForkJoinTask类,只需要继承它的子类,Fork/Join框架提供了两个子类:
a.RecursiveAction:用于没有返回结果的任务
b.RecursiveTask:用于有返回结果的任务
2.ForkJoinPool:ForkJoinTask需要通过ForkJoinPool来执行
——任务分割出的子任务会添加到当前工作线程所维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列的尾部获取一个任务(工作窃取算法)。
编号 | 方法 | 描述 |
---|---|---|
1 | fork() |
在当前线程运行的线程池中安排一个异步执行。简单的理解就是再创建一个子任务。 |
2 | join() |
当前线程阻塞,子任务运行,当子任务完成的时候返回计算结果。 |
3 | invoke() | 开始执行任务,如果必要,等待计算完成。 |
DEMO:
package practice;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
public class Task
//******1-1000累加 -> 500500
{
public static void main(String[] args)
{
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask<Integer> forkJoinTask = pool.submit(new TaskA(1,1000));
try
{
Integer result = forkJoinTask.get();
System.out.println("result:"+result);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
//ForkJoinTask任务:
//a.RecursiveAction:用于没有返回结果的任务
//b.RecursiveTask:用于有返回结果的任务
class TaskA extends RecursiveTask<Integer>{
private static final Integer MAX = 200;
//实例时传入计算的值域
private Integer startNum;// 1
private Integer endNum;// 1000
TaskA(int start,int end){
startNum = start;
endNum = end;
}
protected Integer compute()
{
if((endNum - startNum)>MAX){//说明任务可以拆分
TaskA task1 = new TaskA(startNum,(startNum+endNum)/2);//此处达到改变变量的作用--递归思想
task1.fork();//在当前线程运行的线程池中安排一个异步执行。简单的理解就是再创建一个子任务。
TaskA task2 = new TaskA((startNum+endNum)/2+1,endNum);
task2.fork();
System.out.println("what's this:"+task1.join());
return task1.join()+task2.join();//任务完成时返回计算结果
}else{
//进行汇总
System.out.println("开始值:"+startNum+" 结束值:"+endNum);
int temp = 0;
for (int i = startNum; i <= endNum; i++)
{
temp += i;
}
return temp;
}
}
}
开始值:751 结束值:875
what's this:101625
开始值:876 结束值:1000
开始值:1 结束值:125
开始值:251 结束值:375
what's this:39125
开始值:626 结束值:750
开始值:501 结束值:625
what's this:70375
what's this:156375
开始值:376 结束值:500
开始值:126 结束值:250
what's this:7875
what's this:31375
what's this:125250
result:500500
使用Fork/Join解决实际问题——高效排序
——使用归并算法解决排序问题
核心算法思路将大的问题分解成多个小问题,并将结果进行合并。
内容总结
以上是互联网集市为您收集整理的Fork/Join 归并算法全部内容,希望文章能够帮你解决Fork/Join 归并算法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。