繁体   English   中英

ForkJoinTask - join() 与 invoke()

[英]ForkJoinTask - join() vs invoke()

Java 文档说接下来是join()

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

对于invoke()

开始执行此任务,如有必要等待其完成,并返回其结果,或者如果底层计算这样做,则抛出(未经检查的)RuntimeException 或错误。

但即使阅读了文档,我也无法理解它们之间的区别。 他们都在等待未来返回结果,据我了解他们以不同的方式处理异常?

在 ForkJoinTask API 文档中,

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

简单来说,invoke() == fork();join();

fork() 本身是异步的,它将任务分成两个工作单元并将一个单元传递给另一个 ForkJoinTask,可用的 ForkJoinTask 数量由您的 ForkJoinPool 定义。 并且,您将调用 join()/get() 以等待它完成。

同时,对于invoke(),它是同步的,在主线程调用ForkJoinTask,立即阻塞主线程。 如果您需要在 fork() 和 join() 之间执行某些操作,则您不能。

所以我的建议是当您在 fork() 和 join() 之间无事可做并且您只需要纯多线程功能时使用 invoke() 。 如果您想在 ForkJoinTasks 之间进行高级连接或在两者之间执行某些操作,请使用 fork();join();

但请记住,这两种方法并不意味着您的任务会拆分到另一个线程中。 这取决于您机器中的物理线程数和为您的 ForkJoinPool 初始化的池数。

暂无
暂无

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

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