package com.model.threadpool;
import java.util.concurrent.*;
/**
* @Description:测试类
* @Author: 张紫韩
* @Crete 2021/6/9 9:16
*/
public class ForkJoinDemo {
/**
*分支合并框架:
* ForkJoinPool
* ForkJoinTask
* RecursiveTask
*
* 例子:实现0都100的相加,使用分支和合并的方式实现,
* 讲0 到100分成0到50和51到100,在讲0到50分。。。
* 最后在和并到一起,多个线程递归实现相加,比一个线程的方式快
*
* fork():异步执行任务
* Join():返回完成状态
* 实现了future接口,我们可以直接get返回值
*/
public static void main(String[] args) throws ExecutionException, InterruptedException {
ForkJoinPool forkJoinPool=new ForkJoinPool();
MyTask myTask=new MyTask(0, 100);
ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
System.out.println(forkJoinTask.get());
forkJoinPool.shutdown();
}
}
class MyTask extends RecursiveTask<Integer> {
private Integer start;
private Integer end;
private Integer res=0;
private static final Integer ADJUST_VALUE=10;
public MyTask(Integer start, Integer end) {
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
if (end-start<=ADJUST_VALUE){
for (int i=start;i<=end;i++){
res+=i;
}
}else {
Integer mobile=(start+end)/2;
MyTask myTask=new MyTask(start,mobile);
MyTask myTask1=new MyTask(mobile+1, end);
myTask.fork();
myTask1.fork();
res=myTask.join()+ myTask1.join();
}
return res;
}
}