【发布时间】:2014-06-18 21:42:16
【问题描述】:
考虑以下场景:
public void processArray(int a, SomeType array) {
for (int i = 0; i < array.length; ++i) {
recFunction(a, array[i]);
}
}
private void recFunction(int a, SomeType element){
...
recFunction(a + x, element);
recFunction(a + y, element);
...
}
processArray 对数组的每个元素调用 recFunction。如何使用 Java 创建该程序的并行版本?请注意,要处理的数组可能非常大(最多 10,000 个元素)。我的第一个想法是使用 ForkJoinPool,但我绝对不能为每个数组元素创建一个 RecursiveTask,因为那样会创建 10,000 个新对象。
另外,我必须处理不同的数组,因此必须调用 processArray 几次。我想避免每次都创建新线程并使用现有线程。有什么想法可以使用 Executor 或 ForkJoinPool 来实现吗?
【问题讨论】:
-
是否可以拆分您的阵列。例如创建 4 个线程,每个线程计算数组的一半?或者这些元素是相互依赖的?将这项任务并行化真的值得吗?此外,我认为 ForkJoinTask 与 ForkJoinPool 的规模相当大。一个任务会创建多少个新任务? (也许发布完整的问题?)
-
10k 数组太小而无法并行化,10m 是一个候选。然后,按照 JavaDoc 中的示例分解数组。当达到阈值时,您在大数组的一部分上调用 ProccessArray() 并将结果连接到链上。
-
@edharned:如果一个元素的处理需要很长时间,那么并行化可能是值得的。
-
@OP 为真。然后按照 JavaDoc 中的分解示例或 StackOverflow 上的 Many, Many 示例进行操作。
-
创建 10k
RecursiveTask对象的开销非常低,但是,其他 cmets 是有效的:您不会只使用单个元素(也就是说,无论如何您可能会以 1000 个任务结束,每个处理 10 个元素左右),以及函数是递归的事实是否是使用 fork join 池的原因,目前还不清楚。
标签: java arrays multithreading recursion concurrency