编程语言
首页 > 编程语言> > 使用Java在循环内并行执行方法

使用Java在循环内并行执行方法

作者:互联网

我有下面的代码.在一个循环中,它正在执行方法“ process”.它按顺序运行.我想并行运行此方法,但是应该在循环内完成它,以便可以在下一行中求和.即即使它并行运行,所有功能也应在第二个for循环执行之前完成.

如何在Jdk1.7而非JDK1.8版本中解决此问题?

public static void main(String s[]){
    int arrlen = 10;
    int arr[] = new int[arrlen] ;

    int t =0;
    for(int i=0;i<arrlen;i++){
        arr[i] = i;
        t = process(arr[i]);
        arr[i] = t;
    }

    int sum =0;
    for(int i=0;i<arrlen;i++){
        sum += arr[i];
    }
    System.out.println(sum);

}

public static int process(int arr){
    return arr*2;
}

解决方法:

以下示例可能会对您有所帮助.我已经使用fork / join框架来做到这一点.

对于像您的示例这样的小型数组,常规方法可能会更快,并且我怀疑fork / join方式会花费更长的时间.但是对于较大的规模或过程,fork / join框架是合适的.甚至Java 8并行流也使用fork / join框架作为基础.

public class ForkMultiplier extends RecursiveAction {
        int[] array;
        int threshold = 3;
        int start;
        int end;

        public ForkMultiplier(int[] array,int start, int end) {
            this.array = array;
            this.start = start;
            this.end = end;
        }

        protected void compute() {
            if (end - start < threshold) {
                computeDirectly();
            } else {
                int middle = (end + start) / 2;
                ForkMultiplier f1= new ForkMultiplier(array, start, middle);
                ForkMultiplier f2= new ForkMultiplier(array, middle, end);
                invokeAll(f1, f2);
            }
        }

        protected void computeDirectly() {
            for (int i = start; i < end; i++) {
                array[i] = array[i] * 2;
            }
        }
    }

您的主要班级想在下面这样

 public static void main(String s[]){

        int arrlen = 10;
        int arr[] = new int[arrlen] ;


        for(int i=0;i<arrlen;i++){
            arr[i] = i;
        }

        ForkJoinPool pool = new ForkJoinPool();
        pool.invoke(new ForkMultiplier(arr, 0, arr.length));

        int sum =0;
        for(int i=0;i<arrlen;i++){
            sum += arr[i];
        }

        System.out.println(sum);

    }

标签:java-threads,multithreading,java
来源: https://codeday.me/bug/20191110/2014778.html