为什么我们要在invokeAll方法之后调用join?

2024-07-01

我正在尝试了解 ForkJoinPool 框架并遇到以下示例:

 public class ArrayCounter extends RecursiveTask<Integer> {
 int[] array;
 int threshold = 100_000;
 int start;
 int end;

 public ArrayCounter(int[] array, int start, int end) {
    this.array = array;
    this.start = start;
    this.end = end;
  }

  protected Integer compute() {
    if (end - start < threshold) {
        return computeDirectly();
    } else {
        int middle = (end + start) / 2;

        ArrayCounter subTask1 = new ArrayCounter(array, start, middle);
        ArrayCounter subTask2 = new ArrayCounter(array, middle, end);

        invokeAll(subTask1, subTask2);


        return subTask1.join() + subTask2.join();
    }
 }

 protected Integer computeDirectly() {
    Integer count = 0;

    for (int i = start; i < end; i++) {
        if (array[i] % 2 == 0) {
            count++;
        }
    }

    return count;
}
}

Main :

  public class ForkJoinRecursiveTaskTest
  {
  static final int SIZE = 10_000_000; 
  static int[] array = randomArray();
  public static void main(String[] args) {
  ArrayCounter mainTask = new ArrayCounter(array, 0, SIZE);
  ForkJoinPool pool = new ForkJoinPool();
  Integer evenNumberCount = pool.invoke(mainTask);
  System.out.println("Number of even numbers: " + evenNumberCount);
  }
  static int[] randomArray() {
  int[] array = new int[SIZE];
  Random random = new Random();
  for (int i = 0; i < SIZE; i++) {
  array[i] = random.nextInt(100);
  }
  return array;
  }
  }

根据Java文档,invokeAll()将任务提交到池中并返回结果。因此不需要单独的join()。有人可以解释一下为什么在这种情况下需要单独加入吗?


在你的例子中,你正在使用RecursiveTask<Integer>所以你期望返回一个值compute() method.

让我们看看invokAll(t1,t12)签名。

static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2)

so invokeAll()没有返回值。 根据文档:

分叉给定的任务,当每个任务的 isDone 成立或遇到(未经检查的)异常时返回,在这种情况下将重新抛出异常。

So:

return subTask1.join() + subTask2.join();是你的例子的关键。 两个任务在每次完成任务后合并,并将结果递归地传递给下一个调用compute() method.

task.join()

完成后返回计算结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们要在invokeAll方法之后调用join? 的相关文章

随机推荐

  • 如何更改 gdb 中的值

    所以我有这个家庭作业代码 我必须使用 gdb 进行调试 我发现了问题 但不知道如何使用gdb来改变它 define ARRAYSIZE 12 for i ARRAYSIZE 2 i gt 0 i for j i j lt ARRAYSIZE
  • 应用程序挂在 __psynch_mutexwait

    我们的应用程序似乎半随机地挂在 psynch mutexwait 处 它似乎与更新 CoreData 中存储的一堆数据的后台进程有关 但我完全无法弄清楚是谁锁定了导致死锁的原因 以下是 lldb 给我的完整堆栈跟踪 这显然是不完整的 并且线
  • 使用 spring hatoas 公开集合实体上的链接

    我的问题与这里提出的问题几乎相同 在 Spring Data REST 中公开集合实体上的链接 https stackoverflow com questions 24274127 exposing link on collection e
  • 是否可以与类型类中未提及的变量关联类型同义词?

    In 关联类型同义词 http www cse unsw edu au chak papers CKP05 html Chakravarty Keller Jones 该论文似乎表明以下内容是有效的 class C a where type
  • 如果相关服务被终止,如何更新小部件?

    我有一个录音应用程序 目前正在为其开发一个小部件 录音是由在前台状态的服务中运行的音频引擎执行的 每当音频引擎状态更改为暂停 播放 录制时 就会发送广播 并由更新小部件的接收器进行处理 这样 单击小部件中的录制按钮就会开始录制 这会导致发送
  • swaplevel() 和 reorder_levels() 有什么区别?

    在使用 pandas 的分层索引级别时 有什么区别swaplevel https pandas pydata org pandas docs stable generated pandas DataFrame swaplevel html
  • Polymer 1.x:如何在注销后重置整个应用程序

    我有一个聚合物应用程序 当用户注销时 我想将整个应用程序重置为原始状态 现在 当用户注销后重新登录时 应用程序会将用户返回到注销时所在的应用程序状态和页面 有没有方便的 即全局 应用程序设计或代码模式来实现这一点 如果没有任何方便 全局的方
  • 字符集中字符的顺序

    是否通过标准保证字符的顺序 例如 我可以算出字符集表中 1 符号后面跟着 2 符号吗 或者它是特定于平台的 1999 年的 C 标准对字符集是这样规定的 基本源字符集和基本执行字符集都应具有以下成员 拉丁字母表中的 26 个大写字母 拉丁字
  • 自定义 iOS 推送通知声音

    我一直面临一个问题 我在 iOS 中使用自定义声音实现了推送通知 它是一个 MP3 文件 当我在 iOS 5 中收到推送通知时它播放得很好 但在 iOS4 中 它不播放任何声音 你能帮我解决这个问题吗 代码是这样的 aps badge 10
  • 执行 Mongo 查询 db.collection.runCommand("text",{"search":"search text"})

    我需要在我的网站中添加全文搜索选项 在 mongodb 中添加数据库 蒙戈查询 db collection runCommand text search search text 给出了结果 但是如何使用C 执行它 collection In
  • 如何让 Meteor Cordova 应用程序允许访问域

    我刚刚做了流星更新 现在有版本 流星1 0 4 科尔多瓦4 2 0 我最近还使用 mup deploy 将我的服务器移动到数字海洋 我现在发现 虽然桌面和移动网站运行良好 但在 Android 移动应用程序中 图像不再加载 这些图像是公共
  • Angular Material 7 Datepicker:禁用多年视图

    我使用 angular material 7 0 0 rc 0 中的 MatDatepicker 并制作了一个复杂的过滤器 将时间选择器中的每个可见日期与包含大约 200 或 300 个值的数组中的每一天进行比较 每次我将日期选择器切换到多
  • 如何解决 npm install 在非 MAC 操作系统上抛出 fsevents 警告的问题?

    正在抛出以下警告npm install命令 npm WARN optional SKIPPING OPTIONAL DEPENDENCY email protected cdn cgi l email protection node mod
  • 使用device_filter.xml资源文件过滤USB枚举结果

    按照中的说明进行操作Android USB 主机文档 http developer android com guide topics connectivity usb host html discovering d 我设法通过USB DEV
  • 在 HIVE 中运行查询时如何更改 Tez 作业名称

    当我使用 Tez 提交 Hive SQL 时 如下所示 hive default gt select count from simple data 在资源管理器 UI 中 作业名称显示类似HIVE 9d1906a2 25dd 4a7c 9e
  • PostgreSQL - 插入包含数组的复合类型数组

    我有一个包含 TEXT 数组等的复合类型 我在主表中使用它来创建复合类型的数组 如何生成 INSERT 命令 不使用复合类型的默认字段名称 我可以使用复合数组创建一个临时表 然后将其插入主表吗 例如 DROP TABLE collectio
  • 返回每行最大值的列标题

    我有一个电子表格 每月我需要根据该月的表格返回顶级产品 我在下面复制了当前设置的屏幕截图 我目前正在通过创建一个附加列 列H 它使用INDEX MATCH and MAX函数返回该行中最高产品的名称 然后我用另一个INDEX MATCH作为
  • 为什么 HTML5 Media Source 视频无法在 IOS 上运行?

    看来两者 HLS and MPEG DASH 使用相同的Media Source ExtensionAPI 那么为什么HLSvideo仅适用于 IOS 为什么不MPEG DASH在 IOS 上工作吗 造成这个 的核心区别是什么 http n
  • 媒体对象上的 javafx UNKNOWN 持续时间

    我是 Java 和 JavaFX 的新手 过去几年我一直在使用 QT 在 Python 上进行开发 现在我正在使用 Java 和 JavaFX 进行开发 我正在开发一个程序 可以为用户设定的时间播放音乐文件 然后停止 因此 我需要从媒体对象
  • 为什么我们要在invokeAll方法之后调用join?

    我正在尝试了解 ForkJoinPool 框架并遇到以下示例 public class ArrayCounter extends RecursiveTask