使用方法:
1.创建 线程池对象
2.创建继承recursiveTask 的类
3.commit
使用场景:使用 多线程,把大问题分解成小问题,分而治之
例如; 有一个长度为 3亿的数组,要求数组的总数
可以单线程 for循环遍历
也可以递归,拆分这个数组,计算各个部分小数组的值,最后再合并答案
代码如下:
package app;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.*;
/**
* @Author lyr
* @create 2019/9/30 0:28
*/
public class Main {
static int[] arr = new int[300000000];
static Random r = new Random();
static final int MAX_SIZE = 50000;
static {
for(int i=0;i<arr.length;++i)
{
arr[i] = r.nextInt(9000);
}
}
public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {
long l = System.currentTimeMillis();
long ans =0L;
for(int i=0;i<arr.length;++i)
{
ans+=arr[i];
}
System.out.println("sum: "+ans);
System.out.println("时间:"+(System.currentTimeMillis()-l));
ForkJoinPool f = new ForkJoinPool();
AddTask task = new AddTask(0,arr.length);
long t = System.currentTimeMillis();
f.submit(task);
System.out.println("sum:"+task.get());
System.out.println("时间:"+(System.currentTimeMillis()-t));
}
static class AddTask extends RecursiveTask<Long>
{
int start, end;
public AddTask(int start,int end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if(end - start <=MAX_SIZE)
{
long t=0L;
for(int i = start; i< end; ++i)
{
t+=arr[i];
}
return t;
}
int m = start + (end - start)/2;
AddTask t1 = new AddTask(start,m);
AddTask t2 = new AddTask(m, end);
t1.fork();
t2.fork();
return t1.join()+t2.join();
}
}
}
sum: 1349842423642
时间:163
sum:1349842423642
时间:138
可以看一下这篇文章
fork 开启线程异步执行
join 再把分开执行的任务结果合并