7

是否有必要使用join()withfork()或者我也可以使用join(), get(), invoke(). 我检查了API,除此之外, get()InterruptedException没有ExecutionException看到差异……而且invoke()看起来完全一样。

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

编辑:我在引用的 API 中的错误实际上说明了一些关于它的内容,正如已经收到的答案所指出的那样。但是它们是什么意思:

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

提前致谢。

4

2 回答 2

7

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

调用

开始执行此任务,在必要时等待其完成,并返回其结果,或者如果基础计算这样做,则抛出(未经检查的)RuntimeException 或 Error。

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

得到

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

此方法继承自Future,此方法类似于join。从 javadoc 为join

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

因此,要使用 Fork/Join 框架,您需要调用fork它是异步的。然后在本地完成任务的另一部分。然后调用join

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

这个想法是你将你的任务分成两个离散的单元,然后将一个传递给另一个ForkJoinTaskvia fork- 这与 current 并行运行Thread。然后,您处理当前Thread. 完成后,您调用join第一个任务以确保您从中获得结果。

调用invoke 等待被调用的任务完成。所以你的方法现在不是异步的。您只需按顺序运行所有部分,这在某种程度上击败了 fork/join 的点。

因此,如果您要调用x.fork().join()它,它将与 相同,x.invoke()但重点是您确实在调用和Thread 之间的电流上工作。forkjoin

于 2013-07-26T08:10:22.907 回答
0

它写在您引用的 API 文档中:

等待完成和提取任务结果的主要方法是 join(),但有几种变体: Future.get() 方法支持可中断和/或定时等待完成并使用 Future 约定报告结果。方法invoke()在语义上等价于fork();join() 但总是尝试在当前线程中开始执行。这些方法的“安静”形式不会提取结果或报告异常。当一组任务正在执行时,这些可能很有用,您需要延迟处理结果或异常,直到全部完成。方法 invokeAll(在多个版本中可用)执行最常见的并行调用形式:分叉一组任务并将它们全部连接起来。

于 2013-07-26T08:09:35.097 回答