ForkJoin框架

ForkJoin框架采用了分治思想,fork-分,join-合,把大的计算任务分解成多级子任务,对每个末级子任务开辟线程处理,末级子任务再向上通过某种计算逻辑逐级合并成一个大任务。这样拆分节省了内存空间,多线程并发编程节省了计算时间。

在大数据领域有MapReduce框架,处理hdfs分布式存储的文件,而jdk1.7实现了ForkJoin框架,屏蔽多任务时的线程管理与分配细节,程序员只需要定义这个大任务,关注拆分与合并的逻辑。

***下面举对1亿个数排序的例子***

array是个1亿长度的数组,现在对它快速完成排序,采用归并排序:

      排序具体实现写在自建的ArrayMergerSortTask.java中,自己定义的ArrayMergeSortTask需要继承ForkJoinTask类 的 RecursiveAction子类。

     ArrayMergerSortTask.java:

  • 用到ForkJoin框架中的ForkJoinPool线程池

     

  •  重写RecursiveAction类中的compete()方法

大任务stask是对数组排序,那么如何定义这个排序任务ArrayMergerSortTask呢?

     

      可以看到继承了RecursiveAction

RecursiveAction是什么类呢?

     ForkJoinTask类里面两个最主要子类:RecursiveTaskRecursiveAction,RecursiveTask有返回值,RecursiveAction       无返回值(void),从名字action可以看出,只是执行计算。

ForkJoinTask类是什么呢?

      

      可以看到FrokJoinTask类实现了Future,Future我们都知道是异步的。

看下ForkJoinPool的sumbit()InvokeAll()方法,线程池提交了大任务,。

       找到ForkJoinPool.java里面:

  • submit()

       

        submit方法里面提交的任务是ForkJoinTask<T>的,呼应前面的继承ForkJoinTask的RecursiveAction。

  • invokeAll()

       

       invokeAll传两个任务。

      

       等待一个异步的结果,两个任务根据计算逻辑合并后的结果。

ForkJoinPool中线程数量是Runtime.getRuntime().availableProcessors(),处理器的数量。因为ForkJoin框架用于处理繁重的计算,计算密集型任务不需要很多线程。

     

总结:看了ForkJoin框架中ForkJoinPool.java与ForkJoinTask.java两个模块。框架里面对多线程并发进行管理,把拆分、什么时候开启新一轮合并、管理线程和内存等难点都实现了,而我们只需要关注做什么计算任务,任务怎么拆分的逻辑。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值