如何提高java程序的性能?

时间:2016-08-31 08:38:08

标签: java java-ee

我有一个Calc Runner java类。在这个类过程6000 recrods,每个记录有一些计算需要5-6天来处理所有记录。如何用多线程改进代码提前谢谢

1 个答案:

答案 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]);
        }
    }

}