我有大量对象,并希望收集具有特定字段值的所有对象,并且由于它是如此之大,因此我计划在Java中使用fork / join。

大型数组不是通过创建新的子列表而是通过传入原始列表但具有开始/结束范围来分叉的。计算查找满足特定谓词的所有对象,并将它们添加到ConcurrentLinkedQueue中传递的对象。
加入所有子任务后,将ConcurrentLinkedQueue写入存储。

输入的大列表是否必须为同步列表?我相信不是因为线程启动发生在规则之前,我认为它在fork / join执行开始时的状态对于任何任务/线程都是可见的。但是我想确认我的理解是正确的。

最佳答案

与各种fork-join动作相关联的是发生在边缘之前的事件,因此您通常可以背负这些事件而无需额外的同步。但是,您可能会发现以下内容(在后台使用FJ)以较少的工作量为您提供了所需的答案:

Element[] matching =
    Stream.of(largeArray)
          .parallel()
          .filter(e -> e.theField.equals(theTargetValue))
          .toArray();

10-08 03:57