传统的Java书籍中,Forkjoin线程池仍然更少。毕竟,这是Java8引入的产品。
首先,简要解释forkjoin的操作原理,这实际上有点像合并计算。
1.他将按照某些规则(叉)分解为多个小任务
2.当任务在一定程度上很小时,将执行计算
3.执行完成后,它将与其他小任务合并,所有小结果将逐渐与大结果结合在一起。
您可以看到此forkjointask的伪编码,也就是说,如果要使用forkjoin执行任务,则需要继承recursivetask的任务作为forkjoin池的提交对象:
然后,实际上,整个Forkjoin都有许多细节。在这里,我给了自己一些问题,以逐步理解forkjoin的原则
问:forkjoin中的各种线程如何得到那些小任务?
答:他是通过秘密工作获得的。
问:叉时发生了什么?
答:这是一个异步操作,将此叉添加到当前线程队列中。如果可以放入它,它将返回,并且将不等待。注意默认情况下将签给默认叉的任务。当您无法完成自己时,您可以被别人拿走!
问:加入是什么意思?你什么时候做的?
答:请参阅实现ForkJoin任务接口的代码:
每次完成时,您都可以通过加入来查看子任务的结果。获得它后,您将合并计算并返回结果。
问:Join的阻塞过程如何?如果线悬挂,该线程不起作用?
答:首先,新的子提法已在叉子之前放在队列中。
每个子任务都有一个任务状态。当调用子任命的联接时,他将在周期中判断自己的身份
如果此子 - 启用状态尚未完成,请从他自己的队列或其他人的队列中进行新任务,因此请输入exec()操作的下一层。您自己的线程,或者可以由其他线程完成。无论如何,此任务的状态已同步和可见),然后将结果返回到上层。因此,联接的本质是递归过程。如果任务未完成,他将采取其他任务继续递归执行。
有关更多详细信息,请参阅此链接以获取+加入过程以详细解释
问:何时将forkjoin存储在任务中,如何保证不会存在并发问题?例如,如果您同时插入团队的尽头
A::
问:forkjoin应用程序在哪里?
答:Java8流的并行并发函数基于ForkJoin,即ForkJoin拆卸任务和执行任务由ParalleStream实施,并使用机器的所有CPU的CPU金额。如果您需要限制线程,您可以使用新的forkjoin(thread).submit(() - >(list.stream()。parallel()。map()...));
本文分享了华为云社区的“ Forkjoin池”的学习和思考,作者:BreakDraw。