ForkJoin框架解析

ForkJoin框架是Java7用于并行执行任务的工具,采用工作窃取算法,将大任务拆分为小任务并行执行,最后合并结果。通过继承RecursiveTask创建任务,使用ForkJoinPool执行。工作窃取算法通过双端队列实现,线程从其他线程队列中窃取任务。框架包括ForkJoinPool、ForkJoinTask和ForkJoinWorkerThread,涉及pushTask、join、fork等核心方法。
摘要由CSDN通过智能技术生成
一、概念
    Fork/Join框架是Java7提供的一个用于并行执行任务的框架,思想是把一个大任务分解成多个小任务,并行执行小任务,最后合并每个小任务的执行结果获得大任务结果。
    work-stealing算法:工作窃取算法,一个线程从其他线程的任务队列中窃取任务来执行,使用双端队列实现。优点:利用多线程进行并行计算;缺点:创建队列增加系统开销。

二、原理
  1.分割任务
    需要一个task类,继承 RecursiveTask类 ,能够递归将任务分割为小任务,直到任务足够小为止。
  2.执行任务、合并结果
    将分割成的子任务分别放入双端队列,启用多个线程分别执行多个任务队列中的任务,任务返回结果后进行合并。
三、基本使用
  1.使用流程
    继承RecursiveTask类,实现compute()方法,创建ForkJoinPool对象,调用pool的invoke(task)/submit(task)方法来执行任务。
    compute()方法中需要定义在任务不满足条件时,继续分割任务,子任务递归调用compute()方法,直到满足足够小的条件再对子任务进行计算并返回结果。
  2.ForkJoinPool构造
    参数有:
    parallelism:可并行级别,决定框架内并行执行的线程数量。
    asyncMode:异步模式,指定任务队列是先进先出模式或后进先出模式。
    通常推荐使用该类的静态方法commonPool()来快速获取ForkJoinPool对象。
  3.核心方法
    fork方法:将子任务放入当前线程的workQueue的双端队列中,框架根据当前正在并发执行ForkJoinTask任务的ForkJoinWorkerThread线程状态,决定让这个任务在队列中等待,或者创建一个新workerThread线程运行它,或者唤醒其他等待任务的 workerThread执行它。
    join方法:让当前线程阻塞,直到调用join的子任务执行完并返回结果。如果该子任务在当前线程的任务等待队列workQueue中,则取出该子任务然后递归执行完毕。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值