有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

雅加达ee如何提高java程序的性能?

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


共 (1) 个答案

  1. # 1 楼答案

    你的问题有几种解决办法。 其中之一是使用Fork/Join框架。 下面是一个示例,只是向您展示它是如何工作的

    当然,这只是一个例子,你可以根据自己的需要进行定制;在现实生活中,没有人会仅仅使用Fork/Join框架将数组中的值加倍

    假设您有一个int数组(sourceArray),并且希望用sourceArray的所有值填充另一个数组(targetArray)。 您可以创建一个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]);
            }
        }
    
    }