Java 8之前可以并行实现吗?

时间:2018-10-03 03:07:08

标签: java java-8 parallel-processing

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

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

C#具有类似的形式:

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

但是!它还具有以下语法,可能不符合上述语法:

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

这带给我一个问题-Java是否有一种方法可以在Java 8之前相对简单地进行并行foreach?谷歌搜索似乎没有任何结果,我还尝试了关于Baeldung等的几篇文章herehere,但没有更老的方法了。

有一个吗?

3 个答案:

答案 0 :(得分:3)

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

Java 5还添加了ThreadPoolExecutor,它不是专门用于运行分解后的子任务的,但是仍然可以通过一些工作来使用它。

答案 1 :(得分:3)

您可以从Java7开始执行并行处理,即在Java8之前使用Fork / Join框架进行并行处理。但是,您必须自己拆分数据源,并将代码包装在ForkJoinTask子类中,通常使用其更专业的类型之一,即RecursiveTask(可以返回结果)或{{ 1}}。对于您的情况,由于它没有返回值,因此您必须将代码包装在RecursiveAction中,然后将所有子任务提交到公共Fork / Join池中。

答案 2 :(得分:1)

好吧,如果您使用Spliterator(非常简化)来了解情况如何:如果知道源的大小,它只会将数据分成较小的块(例如,如果例如,则创建缓冲区)您的来源是Iterator,但您不知道它的大小),理论上您可以使用简单的ThreadPool进行处理,然后将每个块传递给线程,然后通过合并结果来计算结果。

诚然,那会相当复杂,尤其是因为ForkJoinPool使用了所谓的偷工作算法-我想这在池中很难实现。但是ForkJoinPool是在Java-7中引入的,即使在Java-8中,如果我没记错的话,它也会进行一些小的调整。所以是的,这可以在java-8之前完成,但是到目前为止,这并不容易。