fork/join

fork/join

核心类

ForkJoinTask 任务的抽象类

ForkJoinWorkerThread 执行任务的线程

ForkJoinPool 执行任务队列的池

 

RecursiveTask继承了ForkJoinTask是一个带有返回的任务类

RecursiveAction不带返回的任务类

 

这里实现一个计算1-100的求和,不用高斯数列,利用任务拆解



 

新建一个SumForkJoinTask并继承RecurisiveTask任务类

重写compute方法,该方法判定是否需要二次拆解任务,如果需要,再次拆解

 



 

ForkJoinPool提交任务方法submit



 由于第一次进入的当前线程肯定不是ForkJoinWorkerThread,所以会走到addSubmission方法



 该方法将任务进队列,如果队列满了进行扩容growSubmissionQueue,在进入队列完毕后,唤醒工作线程signalWork,该方法里面的addWorker


 他和线程池的新增线程很类似,将自己作为ForkJoinWokerThread参数传入进去,并且最后启动该线程,线程run方法



 直接执行pool的work方法,work方法中,有一个不断的去循环获取队列中的任务,如果本队列任务执行完了,可以去窃取其他队列的任务,看一下他的执行任务方法



 thread的execTask方法

 一个循环,直到队列顶和最基本队列数一样,退出循环,最重要的是forkjoin的doExec方法,执行具体任务



 到这里,才算进入具体的任务方法,并在任务执行完毕后,调用setCompletion唤醒其他线程来执行任务

 

exec方法跟踪进去的时候,就可以到具体到底是使用RecursiveTask还是RecursiveAction的子任务类了,随便选择一个,进入exec方法,看到exec方法中最后调用自己的compute方法,这个方法会进入对应的我们自己实现的任务方法中,该方法根据具体的业务,会拆解二级任务,对应fork方法,该方法直接将任务塞进队列,并唤醒signalWork


 首先判定是workerThread,然后判定当前任务是否是队列中的第一个任务,如果是,则执行,执行完退出,如果不是,则执行joinTask方法


 该方法使用tryDeqAndExec来扫描工作组中所有任务,如果有工作线程队列底部正好是当前任务,则执行



 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值