我有一个Calc Runner java类。在这个类过程6000 recrods,每个记录有一些计算需要5-6天来处理所有记录。如何用多线程改进代码提前谢谢
答案 0 :(得分:2)
您的问题有几种解决方案。 其中之一是使用Fork / Join框架。 这是一个例子,只是为了向您展示它是如何工作的。
当然,这只是一个例子,您可以根据自己的需要进行定制;在现实生活中,没有人会使用Fork / Join框架来加倍数组中的值。
假设您有一个int数组(sourceArray),并且您希望填充另一个数组(targetArray),其中sourceArray的所有值都加倍。 您可以创建一个RecursiveAction,它包含compute()方法中的逻辑。如果批量大小足够小,计算方法可以决定计算值本身,或者可以创建委托计算的其他两个较小的任务。
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]);
}
}
}