【发布时间】:2019-10-23 17:47:14
【问题描述】:
我希望将一个数组并行复制到另一个数组中,例如:
int[] a = {1, 3, 5, 7, 9};
int[] b = new int[a.length];
for(int i = 0; i < a.length; i++) // parallel
{
b[i] = a[i];
}
在这个例子中,我希望一个线程复制前 3 个索引,另一个复制其他 2 个。当然,它也可以是任何其他变体。
需要考虑的事项:
- 我打算在非常大的阵列上运行它,所以开销很小就可以了
- 循环体中可能添加了更多代码,例如另一个数组 - c 将获得 a[i]+1
我尝试过的:
-
IntStream.range:
IntStream.range(0, a.length).parallel().forEach(i -> {
b[i] = a[i];
});
这导致Local variable percentiles defined in an enclosing scope must be final or effectively final 错误,因为b 不是final 并且无法分配。
- fork/join:可能是这样,但正在寻找不涉及声明新类或扩展现有类的其他解决方案。
【问题讨论】:
-
数组有多大?
-
将数组b[]声明为final,然后将值赋给数组b的相应位置
-
ideone.com/vaP3pU final, YMMV,它也可以工作 - 不过,我在这里没有看到真正的问题;如果您的编译器/运行时对
b不是final感到不满,那就让它final,实际问题在哪里?Local variable percentiles defined in an enclosing scope建议您在某处有一个名为percentiles的变量,它看起来像是错误的真正来源。 -
@malt 数组有超过 100,000,000 个元素。我知道按顺序执行可能会更快,但想知道是否可以使其并行
-
@Bishal Jaiswal 我确定你做不到!它可能会解决第 1 次尝试...
标签: java arrays multithreading parallel-processing