import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveAction;
public class ForkJoinPoolExample {
public static final int ARRAY_SIZE = 6000;
public static int[] sourceArray = new int[ARRAY_SIZE];
public static int[] targetArray = new int[ARRAY_SIZE];
public void initArray() {
for (int i=0; i<ARRAY_SIZE; i++) {
sourceArray[i] = i;
}
}
public static class Calc extends RecursiveAction {
private int from;
private int to;
public static final int BATCH_SIZE=5;
public Calc(int from, int to) {
this.from = from;
this.to = to;
}
@Override
protected void compute() {
if (to-from <= BATCH_SIZE) {
for (int i = from; i<to; i++) {
targetArray[i] = sourceArray[i] * 2;
}
} else {
int middle = from +((to - from)/2);
invokeAll(new Calc(from, middle), new Calc(middle, to));
}
}
}
public static void main(String[] args) {
ForkJoinPoolExample fjpe = new ForkJoinPoolExample();
fjpe.initArray();
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask task = new Calc(0, ARRAY_SIZE);
pool.invoke(task);
for (int i=0; i<ARRAY_SIZE; i++) {
System.out.println(sourceArray[i] + " -> " + targetArray[i]);
}
}
}
# 1 楼答案
你的问题有几种解决办法。 其中之一是使用Fork/Join框架。 下面是一个示例,只是向您展示它是如何工作的
当然,这只是一个例子,你可以根据自己的需要进行定制;在现实生活中,没有人会仅仅使用Fork/Join框架将数组中的值加倍
假设您有一个int数组(sourceArray),并且希望用sourceArray的所有值填充另一个数组(targetArray)。 您可以创建一个RecursiveAction,它在compute()方法中包含您的逻辑。如果批大小足够小,则计算方法可以决定自己计算值,或者可以创建两个其他较小的任务来委托计算