徐锦洪 发表于 2023-6-14 14:56:38

无限分解流----Fork/Join框架

Fork译为拆分,Join译为合并
Fork/Join框架的思路是把一个非常巨大的任务,拆分成若然的小任务,再由小任务继续拆解。直至达到一个相对合理的任务粒度。然后执行获得结果,然后将这些小任务的结果汇总,生成大任务的结果,
直至汇总成最初巨大任务的结果。如下图:
https://img2023.cnblogs.com/blog/704073/202306/704073-20230614141226481-918845211.png
红色箭头代表拆分子任务。
绿色箭头代表返回子任务结果
这个框架的思路听起来,其实用传统的线程池、多线程完全就可以解决。但是内部却有很多小的细节(后边会说到),再加上清晰的使用思路,让这个框架还是在多线程并发中,占有了一席之地。
Fork/Join框架下,我们常用到三个类:(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
RecursiveAction,子任务类,支持子任务有返回结果任务
RecursiveTask,子任务类,用于有返回结果的任务
ForkJoinPool,执行子任务的线程池。
话不多说,我们直接看代码:
1 public class SumDemo extends RecursiveTask { 23   int maxLen = 800_0000; 45   int[] arr; 6   int start; 7   int end; 89 10   public SumDemo(int[] arr, int start, int end) {11         this.arr = arr;12         this.start = start;13         this.end = end;14   }15 16   @Override17   protected Long compute() {18         if (end - start < maxLen) {19             long a = sum();20             try {21               //Thread.sleep(1);22             } catch (Exception e) {23             }24             return a;25         }26         int middle = (start + end) / 2;27         SumDemo left = new SumDemo(arr, start, middle);28         SumDemo right = new SumDemo(arr, middle + 1, end);29         left.fork();30         right.fork();31         //invokeAll(left,right);32         long leftRtn = left.join();33         long rightRtn = right.join();34         return leftRtn + rightRtn;35   }36 37   private Long sum() {38         System.out.println("now" + Thread.currentThread().getName() + "-start:" + start + "-end:" + end);39         long sum = 0;40         for (int i = start; i
页: [1]
查看完整版本: 无限分解流----Fork/Join框架