工作了一段时间,渐渐的失去了当初学习技术的热情。新入职的程序老大哥们,让我寻找到了前进的方向。窝在这个非互联网公司里。真的需要走出,看看外面的时间。不能一直停留在舒适区。
简介
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;}@Overrideprotected 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的写法,这个例子下有时不比单线程执行快。
