并发编程从零开始(十七)-ForkJoinPool(终章)
22 ForkJoinTask的fork/join
如果局部队列、全局中的任务全部是相互独立的,就很简单了。但问题是,对于分治算法来说,分解出来的一个个任务并不是独立的,而是相互依赖,一个任务的完成要依赖另一个前置任务的完成。
这种依赖关系是通过ForkJoinTask中的join()来体现的。且看前面的代码:
线程在执行当前ForkJoinTask的时候,产生了left、right 两个子Task。
fork是指把这两个子Task放入队列里面。
join则是要等待2个子Task完成。
而子Task在执行过程中,会再次产生两个子Task。如此层层嵌套,类似于递归调用,直到最底层的Task计算完成,再一级级返回。
22.1 fork
fork()的代码很简单,就是把自己放入当前线程所在的局部队列中。
如果是外部线程调用fork方法,则直接将任务添加到共享队列中。
22.2 join的嵌套
1.join的层层嵌套阻塞原理
join会导致线程的层层嵌套阻塞,如图所示:
线程1在执行 ForkJoinTask1,在执行过程中调用了 forkJoinTask2.joi