代码之家  ›  专栏  ›  技术社区  ›  VSO

在Java 8之前是否可能并行?

  •  2
  • VSO  · 技术社区  · 7 年前

    我们都知道流允许我们对每个执行并行,例如(实际代码不重要):

    Arrays.stream(ints).parallel()...
    

    C具有类似的形式:

    ints.AsParallel().Select(int=> ....
    

    但是!它还具有以下语法,可能早于或不早于上述语法:

    Parallel.ForEach(ints, anInt => {});
    

    这就引出了我的问题——Java是否有一种在Java 8之前相对简单地执行并行前行的方法?谷歌这个似乎没有结果,我也尝试了一些文章 here , here 在拜登等地,看不到更古老的方法来做这件事。

    有吗?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Ravindra Ranwala    7 年前

    您可以从Java7开始执行并行处理,即在Java8之前使用fork/join框架。但您必须自己拆分数据源,并将代码包装在 ForkJoinTask 子类,通常使用它的一个更专门的类型,或者 RecursiveTask (可返回结果)或 RecursiveAction . 在您的情况下,由于它没有返回值,因此必须将代码包装在 递归作用 并将所有子任务提交到公共fork/join池中。

        2
  •  3
  •   user8021515    7 年前

    不完全正确,但是Java 7增加了 ForkJoinPool 它专门用于并行执行分解的子任务(较大任务的一部分)。这很容易应用于 Collection .

    Java 5还添加了 ThreadPoolExecutor ,这不是专门用于运行分解的子任务,但它仍然可以在做更多的工作时使用。

        3
  •  1
  •   Eugene    7 年前

    好吧,如果你看看在引擎盖下用 Spliterator (非常简单):如果知道源的大小,它只会将数据分成更小的块(或者,如果您的源是一个 Iterator 你不知道它的大小),理论上你可以用一个简单的 ThreadPool 并将每个块传递给一个线程,然后通过合并这些结果来计算结果。

    诚然,这将相当复杂,尤其是自 ForkJoinPool 使用所谓的 工作窃取 算法——我想用一个池不容易实现。但是 FokCounPo水池 是在java-7中引入的,即使在java-8中,如果我记得正确的话,它也有一些小的调整。所以是的,这可以在java-8之前完成,但到目前为止这并不容易。