多线程中“分而治之,递归计算”,你最好使用ForkJoinPool

今天没有唠叨,直接上demo:

使用RecursiveTask实现一个累加的功能,使用分而治之的思想,实现分段求和后汇总返回结果。

对1到100000000进行求和。

多线程中“分而治之,递归计算”,你最好使用ForkJoinPool

多线程中“分而治之,递归计算”,你最好使用ForkJoinPool

注意else循环中不是一分为2,而是递归处理的。不明白请看下面日志输出:

多线程中“分而治之,递归计算”,你最好使用ForkJoinPool

上面示例是有返回值的使用,当然也可以是没有返回值的。此时需要用到:RecursiveAction。这里不再举例,感兴趣的同学下去可以自己写一个小demo。

附上源码

/**
* 测试并行任务


*
*
* @author: IT讲坛
* @see [相关类/方法](可选)
* @since 1.0.0
**/
public class TestForkPool {


private static ForkJoinPool pool = new ForkJoinPool();


private static class SumTask extends RecursiveTask<long> {
private static final long serialVersionUID = 3828085400692474943L;
private long[] numbers;
private int from;
private int to;

public SumTask(long[] numbers, int from, int to) {
this.numbers = numbers;
this.from = from;
this.to = to;
}

//对任务进行拆分
@Override
protected Long compute() {
// 当需要计算的数字个数小于100时,直接采用for方式计算结果
if (to - from < 100) {
long total = 0;
for (int i = from; i <= to; i++) {
total += numbers[i];
}
return total;
} else {
// 否则,把任务均分,递归拆分(注意此处有递归)到底拆分成多少份,需要根据具体情况而定
System.out.println("FROM:"+from+"-TO:"+to);
int middle = (from + to) / 2;
SumTask taskLeft = new SumTask(numbers, from, middle);
SumTask taskRight = new SumTask(numbers, middle + 1, to);
taskLeft.fork();

taskRight.fork();
return taskLeft.join() + taskRight.join();
}
}
}

public static void main(String[] args) throws ExecutionException, InterruptedException {
long[] numbers = LongStream.rangeClosed(1, 1000).toArray();
ForkJoinTask<long> submit = pool.submit(new SumTask(numbers, 0, numbers.length-1));
Long aLong = submit.get();
System.out.println("结果:"+aLong);


}
}/<long>/<long>


分享到:


相關文章: