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

打印 上一主题 下一主题

主题 869|帖子 869|积分 2607

Fork译为拆分,Join译为合并
Fork/Join框架的思路是把一个非常巨大的任务,拆分成若然的小任务,再由小任务继续拆解。直至达到一个相对合理的任务粒度。然后执行获得结果,然后将这些小任务的结果汇总,生成大任务的结果,
直至汇总成最初巨大任务的结果。如下图:

红色箭头代表拆分子任务。
绿色箭头代表返回子任务结果
这个框架的思路听起来,其实用传统的线程池、多线程完全就可以解决。但是内部却有很多小的细节(后边会说到),再加上清晰的使用思路,让这个框架还是在多线程并发中,占有了一席之地。
Fork/Join框架下,我们常用到三个类:(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
RecursiveAction,子任务类,支持子任务有返回结果任务
RecursiveTask,子任务类,用于有返回结果的任务
ForkJoinPool,执行子任务的线程池。
话不多说,我们直接看代码:
[code] 1 public class SumDemo extends RecursiveTask { 2  3     int maxLen = 800_0000; 4  5     int[] arr; 6     int start; 7     int end; 8  9 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表