无限分解流----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]