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来扫描工作组中所有任务,如果有工作线程队列底部正好是当前任务,则执行