我是否有必要将join()
与fork()
一起使用,或者我也可以使用join()
,get()
,invoke()
。
我检查了API,除此之外get()
抛出InterruptedException
和ExecutionException
我看不出差异...... invoke()
似乎完全相同。
但是我总是看到与fork()
相关的join()
而不是其他两种方法......它们不提供并行性吗?让invoke()
和join()
完全相同的目的是什么?通过实现future,我可以理解get(),但是invoke()和join()呢。提前谢谢。
编辑:在我引用的API中我的不好实际上它说了一些关于它的内容,因为已经收到的答案指出了。但他们的意思是:
方法invoke()在语义上等同于fork(); join()但是 总是试图在当前线程中开始执行
提前致谢。
答案 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
上工作调用fork
和join
。
答案 1 :(得分:0)
它是在您引用的API文档中编写的:
等待完成和提取任务结果的主要方法是join(),但有几种变体:Future.get()方法支持使用Future约定完成和报告结果的可中断和/或定时等待。方法invoke()在语义上等同于fork(); join()但总是尝试在当前线程中开始执行。这些方法的“安静”形式不会提取结果或报告异常。这些在执行一组任务时可能很有用,您需要延迟处理结果或异常,直到完成所有任务。方法invokeAll(在多个版本中可用)执行最常见的并行调用形式:分叉一组任务并将它们全部连接起来。