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

时间:2013-07-26 08:06:51

标签: java concurrency future fork-join

我是否有必要将join()fork()一起使用,或者我也可以使用join()get()invoke()。 我检查了API,除此之外get()抛出InterruptedExceptionExecutionException我看不出差异...... invoke()似乎完全相同。

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

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

  

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

提前致谢。

2 个答案:

答案 0 :(得分:6)

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

  

调用

     

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

我似乎很清楚,在必要时等待它的完成非常明确地说这个方法不是异步的。

  

获取

     

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

此方法继承自Future,此方法类似于join。来自join的javadoc:

  

完成后返回计算结果。这种方法   与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 上工作调用forkjoin

答案 1 :(得分:0)

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

  

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