ForkJoin分支合并计算
ForkJoin 常用其子抽象类
ForkJoinPool
ForkJoinTask:子类
RecursiveTask
public abstract class ForkJoinTask<V> implements Future<V>, Serializable
//实现了Future就是实现了Callable
public abstract class RecursiveTask<V> extends ForkJoinTask<V>
/**
* ForkJoin:
* ForkJoinPool
* ForkJoinTask
* RecursiveTask
*/
public class ForkJoinTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建任务
MyTask myTask = new MyTask(0L, 100L);
//使用ForkJoinPool执行
ForkJoinPool forkJoinPool = new ForkJoinPool();
//执行
ForkJoinTask<Long> submit = forkJoinPool.submit(myTask);
//获取返回值submit.get()
Long aLong = submit.get();
System.out.println("aLong = " + aLong);
// 关闭forkJoinPool
forkJoinPool.shutdown();
/**
* stream形式计算
*/
OptionalLong reduce = LongStream
.rangeClosed(0L, 100L)//计算值rangeClosed包括开始 和结束值
.parallel() //使用并行流计算
.reduce(Long::sum);//指定计算类型为求和
//(x,y)->{return x+y;} <==> Long::sum
/**
* reduce:使某一特定事物在数量、程度或大小上变小或变少。
* 字符串拼接、数值的 sum、min、max、average 都是特殊的 reduce
*/
System.out.println("reduce = " + reduce.getAsLong());
}
}
class MyTask extends RecursiveTask<Long>{
//临界值 超过此值时重复使用递归 将任务无限制分化 小于此值时计算 ,
// 然后就有无数个小任务计算,再拿到他们的join(结果),相加即可
public static final Integer ADJUST_VALUE = 10;
/**
* 起始值
*/
private Long begin;
/**
* 结束值
*/
private Long end;
//返回值
private Long result = 0L;
public MyTask(Long begin, Long end) {
this.begin = begin;
this.end = end;
}
//计算方法
@Override
protected Long compute() {
if ((end-begin)<=ADJUST_VALUE){//计算次数小于10
for (Long i = begin; i <= end; i++) {
result += i;
}
} else {
Long middle = (end+begin)/2;//获取两数的中间数
//第一条线程
MyTask task1 = new MyTask(begin, middle);
//第二条线程
MyTask task2 = new MyTask(middle + 1, end);
//递归调用本compute()方法
task1.fork();
task2.fork();
//合并分支的结果
result = task1.join() + task2.join();
}
return result;
}
}
/**
* 1-100 ->
* 1-50 51-100 不符合if()继续递归 fork()->
* 1-25 26-50 51-75 76-100 不符合if()继续递归 fork()->
* 1-12 13-25 26-38 39-50 51-65 66-75 75-84 85-100
* ......
* 然后通过task1.join() + task2.join();合并所有线程结果
*
*/
aLong = 5050
reduce = 5050
本文探讨了ForkJoin框架,它是并行计算的一种策略,通过将大任务拆分成小任务并行处理,然后合并结果。ForkJoin框架常用于复杂算法的优化,提高计算效率。

被折叠的 条评论
为什么被折叠?



