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

是否有必要使用join()fork()或者我也可以使用join()get()invoke() 。 我检查了API ,除了get()抛出InterruptedExceptionExecutionException我没有看到差异……而invoke()似乎完全相同。

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

编辑 :我在API中的不好实际引用了它,因为已经收到的答案指出了它。 但他们的意思是:

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

提前致谢。

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

调用

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

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

得到

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

此方法inheritance自Future ,此方法类似于join 。 从javadoc join

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

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

fork join框架的基本前提是它用于可以multithreading的分而治之算法。

我的想法是你将任务分成两个独立的单元,然后通过fork将一个传递给另一个ForkJoinTask – 它同时运行到当前的Thread 。 然后,处理当前Thread中的其他单元。 完成后,您可以在第一个任务上调用join ,以确保从中获取结果。

调用invoke 等待调用的任务完成 。 所以你的方法现在不是异步的。 你只是按顺序运行你的所有部分,有点击败fork / join。

因此,如果你要调用x.fork().join()它将与x.invoke()相同,但重点是你调用forkjoin 之间的当前Thread上工作。

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

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