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

Rol*_*all 4 java concurrency future fork-join

是否有必要,我用join()fork()或者我也可以使用任一join(),get(),invoke().我检查了API,除了那个 get()抛出InterruptedException,ExecutionException我没有看到差异......而且invoke()似乎完全相同.

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

编辑:在我引用的API中我的不好实际上它说了一些关于它的内容,因为已经收到的答案指出.但他们的意思是:

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

提前致谢.

Bor*_*der 7

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

调用

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

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

得到

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

这种方法是继承自的Future,这种方法类似于join.从javadoc join:

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

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

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

这个想法是你将任务分成两个独立的单元,然后将一个ForkJoinTask通过另一个通过fork- 它同时运行到当前Thread.然后,您可以处理当前的其他单位Thread.完成后,您可以调用join第一个任务以确保从中获得结果.

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

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