当前位置: 首页 > 网络应用技术

六个问题,六个答案以理解叉

时间:2023-03-08 11:17:42 网络应用技术

  传统的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。