最通俗的例子讲解Java中的fork-join

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最通俗的例子讲解Java中的fork-join相关的知识,希望对你有一定的参考价值。


fork-join说白了就是分治的方法,不断递归,明白二分法的话就很容易理解,但要注意的是,由于fork-join涉及到切换线程上下文,因此不是所有情况下都是能加快速度的。举例,测试一个大数组的求和,可以不断用分段的方法,求出每个范围(比如把数组分成10个部分,每个部分分别求和)。
 

public class SumArray 
private static class SumTask extends RecursiveTask<Integer>

private final static int THRESHOLD = MakeArray.ARRAY_LENGTH/10;
//表示我们要实际统计的数组
private int[] src;
//开始统计的下标
private int fromIndex;
//统计到哪里结束的下标
private int toIndex;

public SumTask(int[] src, int fromIndex, int toIndex)
this.src = src;
this.fromIndex = fromIndex;
this.toIndex = toIndex;


@Override
protected Integer compute()
if(toIndex-fromIndex < THRESHOLD)
int count = 0;
for(int i=fromIndex;i<=toIndex;i++)
//SleepTools.ms(1);
count = count + src[i];

return count;
else
//fromIndex....mid....toIndex

int mid = (fromIndex+toIndex)/2;
SumTask left = new SumTask(src,fromIndex,mid);
SumTask right = new SumTask(src,mid+1,toIndex);
invokeAll(left,right);
return left.join()+right.join();





public static void main(String[] args)

ForkJoinPool pool = new ForkJoinPool();
//随机生成数组
int[] src = MakeArray.makeArray();

SumTask innerFind = new SumTask(src,0,src.length-1);

long start = System.currentTimeMillis();

pool.invoke(innerFind);//同步调用
System.out.println("Task is Running.....");

System.out.println("The count is "+innerFind.join()
+" spend time:"+(System.currentTimeMillis()-start)+"ms");


   在上面的例子中,针对随机数组,一开始指出头部和尾部下标,然后不断进行递归操作就可以了,上面是个标准的
fork-join的模板了

以上是关于最通俗的例子讲解Java中的fork-join的主要内容,如果未能解决你的问题,请参考以下文章

java基础面试+深度讲解—泛型 泛型讲解中最通俗易懂,最详细的一个版本

通俗易懂讲解IO模型

用通俗易懂的例子讲解生产方式,生产力,生产关系的意思。

通过生产者消费者模式例子讲解Java基类方法waitnotifynotifyAll

Java并发之Fork-Join

通俗讲解支持向量机