繁体   English   中英

与叉加入有关:join()vs get()vs invoke()

[英]Fork-Join related: join() vs get() vs invoke()

我是否需要将join()fork()使用,或者也可以使用join()get()invoke() 我检查了API ,除了get()抛出InterruptedExceptionExecutionException我看不出任何区别……而invoke()似乎完全一样。

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

编辑 :我引用的API不好,因为已经收到的答案指出它对它说了些什么。 但是,它们的含义是:

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

提前致谢。

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

调用

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

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

得到

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

此方法是从Future继承的,此方法类似于join 从javadoc join

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

因此,要使用Fork / Join框架,您需要调用异步的fork 然后在本地执行任务的另一部分。 然后调用join

fork联接框架的基本前提是,它可以在多线程的分治算法中使用。

想法是将您的任务分成两个离散的单元,然后通过fork将一个任务传递给另一个ForkJoinTask这与当前Thread同时运行。 然后,您可以处理当前Thread中的另一个单元。 完成后,您可以在第一个任务上调用join ,以确保从中获得结果。

调用invoke 等待调用的任务完成 因此,您的方法现在不是异步的。 您只需按顺序运行所有零件,这在一定程度上击败了fork / join的观点。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM