我们都知道流允许我们并行执行foreach,例如(实际代码并不重要):
Arrays.stream(ints).parallel()...
C#具有类似的形式:
ints.AsParallel().Select(int=> ....
但是!它还具有以下语法,可能不符合上述语法:
Parallel.ForEach(ints, anInt => {});
这带给我一个问题-Java是否有一种方法可以在Java 8之前相对简单地进行并行foreach?谷歌搜索似乎没有任何结果,我还尝试了关于Baeldung等的几篇文章here,here,但没有更老的方法了。
有一个吗?
答案 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之前完成,但是到目前为止,这并不容易。