Fork-Join 相关: join() vs get() vs invoke()

2024-03-29

我有必要使用吗join() with fork()或者我也可以使用其中之一join(), get(), invoke()。 我检查了API http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ForkJoinTask.html#join%28%29除此之外get() throws InterruptedException and ExecutionException我没有看到差异...并且invoke()看起来完全一样。

不过我一直看到相关的fork() with join()而不是其他两种方法......它们不提供并行性吗?拥有的目的是什么invoke() and join()完全一样吗?我可以理解通过实现 future 得到的 get() ,但是 invoke() 和 join() 呢?提前致谢。

EDIT:我引用的 API 中的错误实际上它说了一些关于它的内容,正如已经收到的答案所指出的那样。然而,它们的含义是什么:

方法invoke()在语义上等同于fork();加入()但是 总是尝试在当前线程中开始执行

提前致谢。


您为什么不阅读链接到的文档?

invoke

开始执行此任务,如有必要,等待其完成, 并返回其结果,或者抛出一个(未经检查的)RuntimeException 或 如果底层计算这样做就会出错。

对我来说似乎很清楚如有必要,等待其完成相当明确地说这个方法不是异步的。

get

如有必要,等待计算完成,然后检索 它的结果。

这个方法继承自Future,该方法类似于join。来自 javadocjoin:

完成后返回计算结果。这个方法 与 get() 的不同之处在于异常完成会导致 RuntimeException 或 Error,而不是 ExecutionException,并且会中断 调用线程的值不会导致该方法突然返回 抛出InterruptedException。

因此,要使用 Fork/Join 框架,您需要调用fork这是异步的。然后在本地完成任务的其他部分。然后打电话join.

fork join框架的基本前提是它用于可以是多线程的分治算法。

这个想法是将任务分成两个独立的单元,然后将一个单元传递给另一个单元ForkJoinTask via fork- 这与当前同时运行Thread。然后,您可以处理当前的另一个单元Thread。当你完成后你打电话join在第一个任务上,以确保您从中获得结果。

Calling invoke 等待调用的任务完成。所以你现在的方法not异步。您只需按顺序运行所有部分即可,这在某种程度上击败了分叉/连接点。

所以如果你打电话x.fork().join()它会是一样的x.invoke()但重点是你确实在当前的情况下工作Thread between调用fork and join.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fork-Join 相关: join() vs get() vs invoke() 的相关文章

随机推荐