Java docs forjoin()
:
返回计算完成后的结果。这个方法与get()的不同之处在于异常补全会导致RuntimeException或Error,而不是ExecutionException,这会中断调用线程的方法不会导致方法突然返回抛出InterruptedException。
对于invoke()
:
开始执行此任务,如果需要等待其完成,并返回其结果,或抛出(未检查的)RuntimeException或如果基础计算这样做,则错误。
但是即使在阅读文档之后,我也无法理解它们之间的区别。他们都等待未来返回结果,因为我理解他们以不同的方式处理异常?
在ForkJoinTask API文档中,
等待任务完成和提取结果的主要方法是join(),但也有几种变体:Future.get()方法支持可中断和/或定时等待完成,并使用Future约定报告结果。方法invoke()在语义上等同于fork();Join()总是尝试在当前线程中开始执行。"quiet"这些方法的形式不提取结果或报告异常。当一组任务正在执行,并且需要延迟处理结果或异常,直到全部完成时,这些可能很有用。方法invokeAll(有多个版本可用)执行最常见的并行调用形式:分叉一组任务并将它们全部连接起来。
用简单的话说,调用()= = fork();加入();
fork()本身是异步的,它将任务分成两个工作单元,并将一个工作单元传递给另一个ForkJoinTask, ForkJoinTask可用的数量由你的ForkJoinPool定义。并且,您将调用join()/get()来等待它完成。
同时,对于invoke(),它是同步的,并且ForkJoinTask在主线程上被调用,立即阻塞主线程。如果你需要在fork()和join()之间执行一些操作,你不能。
所以我的建议是使用invoke(),当你在fork() &Join(),您只需要纯多线程功能。如果您想在ForkJoinTasks之间进行高级连接,或者在两者之间执行某些操作,则使用fork();join();
但是请记住,这两种方法并不意味着你的任务将被分割成另一个线程。这取决于机器中物理线程的数量和为ForkJoinPool初始化的池的数量。