工作了一段时间,渐渐的失去了当初学习技术的热情。新入职的程序老大哥们,让我寻找到了前进的方向。窝在这个非互联网公司里。真的需要走出,看看外面的时间。不能一直停留在舒适区。
简介
fork-join:分支合并。就是算法中分治算法。但是这个框架帮助我们分治后使用多线程去跑分治后的任务。其具体的实现方式是:
- 任务没有返回值:继承
RecursiveAction
类,重写computer()
方法 - 任务有返回值:继承
RecursiveTask<T>
类,重写computer()
方法实战
需求:计算1~1000000000数字累加结果常规写法
/**
* 总用时:420秒左右
* @param args
*/
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
long sum =0;
for(int i=1;i<=1000000000;i++){
sum+=i;
}
System.out.println(sum);
System.out.println("总用时"+(System.currentTimeMillis()-startTime));
}
Fork-Join框架写法
```java public static void main(String[] args) throws ExecutionException, InterruptedException { long startTime = System.currentTimeMillis(); ForkJoinPool forkJoinPool = new ForkJoinPool(); AccCount accCount = new AccCount(1, 1000000000); ForkJoinTasksubmit = forkJoinPool.submit(accCount); System.out.println(submit.get()); System.out.println(“总用时”+(System.currentTimeMillis()-startTime)); }
public class AccCount extends RecursiveTask
public int start;
public int end;
public static final int threshold = 1000;
public AccCount(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if(end-start<=threshold){
long sum = 0;
for(int i=start;i<=end;i++){
sum+=i;
}
return sum;
}
int mid = (end+start)/2;
AccCount accCount = new AccCount(start, mid);
AccCount accCount1 = new AccCount(mid + 1, end);
accCount.fork();
accCount1.fork();
return accCount.join()+accCount1.join();
}
}
``` fork-join的写法,这个例子下有时不比单线程执行快。