Fork-Join相关:join()vs get()vs invoke()
是否有必要使用join()
和fork()
或者我也可以使用join()
, get()
, invoke()
。 我检查了API ,除了get()
抛出InterruptedException
和ExecutionException
我没有看到差异……而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()
相同,但重点是你在调用fork
和join
之间的当前Thread
上工作。
它是在您引用的API文档中编写的:
等待完成和提取任务结果的主要方法是join(),但有几种变体:Future.get()方法支持使用Future约定完成和报告结果的可中断和/或定时等待。 方法invoke()在语义上等同于fork(); join()但总是尝试在当前线程中开始执行。 这些方法的“安静”forms不会提取结果或报告exception。 当执行一组任务时,这些可能很有用,并且您需要延迟处理结果或exception,直到所有任务完成。 方法invokeAll(在多个版本中可用)执行最常见的并行调用forms:分叉一组任务并将它们全部连接起来。