[英]Fork-Join related: join() vs get() vs invoke()
我是否需要将join()
与fork()
使用,或者也可以使用join()
, get()
, invoke()
。 我检查了API ,除了get()
抛出InterruptedException
和ExecutionException
我看不出任何区别……而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()
相同,但要点是,您确实在调用fork
和join
之间的当前Thread
上进行工作。
它是用您引用的API文档编写的:
等待完成和提取任务结果的主要方法是join(),但有几种变体:Future.get()方法支持可中断和/或定时等待完成,并使用Future约定报告结果。 方法invoke()在语义上等效于fork(); join(),但始终尝试在当前线程中开始执行。 这些方法的“安静”形式不会提取结果或报告异常。 当执行一组任务时,这些功能可能很有用,并且您需要将结果或异常的处理延迟到所有任务完成为止。 方法invokeAll(有多个版本可用)执行并行调用的最常见形式:分派一组任务并将它们全部加入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.