1. 工作了一段时间,渐渐的失去了当初学习技术的热情。新入职的程序老大哥们,让我寻找到了前进的方向。窝在这个非互联网公司里。真的需要走出,看看外面的时间。不能一直停留在舒适区。

简介

fork-join:分支合并。就是算法中分治算法。但是这个框架帮助我们分治后使用多线程去跑分治后的任务。其具体的实现方式是:

  • 任务没有返回值:继承RecursiveAction类,重写computer()方法
  • 任务有返回值:继承RecursiveTask<T>类,重写computer()方法

    实战

    需求:计算1~1000000000数字累加结果

    常规写法

    1. /**
    2. * 总用时:420秒左右
    3. * @param args
    4. */
    5. public static void main(String[] args) {
    6. long startTime = System.currentTimeMillis();
    7. long sum =0;
    8. for(int i=1;i<=1000000000;i++){
    9. sum+=i;
    10. }
    11. System.out.println(sum);
    12. System.out.println("总用时"+(System.currentTimeMillis()-startTime));
    13. }

    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); ForkJoinTask submit = forkJoinPool.submit(accCount); System.out.println(submit.get()); System.out.println(“总用时”+(System.currentTimeMillis()-startTime)); }

public class AccCount extends RecursiveTask {

  1. public int start;
  2. public int end;
  3. public static final int threshold = 1000;
  4. public AccCount(int start, int end) {
  5. this.start = start;
  6. this.end = end;
  7. }
  8. @Override
  9. protected Long compute() {
  10. if(end-start<=threshold){
  11. long sum = 0;
  12. for(int i=start;i<=end;i++){
  13. sum+=i;
  14. }
  15. return sum;
  16. }
  17. int mid = (end+start)/2;
  18. AccCount accCount = new AccCount(start, mid);
  19. AccCount accCount1 = new AccCount(mid + 1, end);
  20. accCount.fork();
  21. accCount1.fork();
  22. return accCount.join()+accCount1.join();
  23. }

}

``` fork-join的写法,这个例子下有时不比单线程执行快。