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

标签 java multithreading java-threads

我有如下代码。在一个循环中,它正在执行方法“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 - 使用Java在循环内并行执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47452874/

相关文章:

java - 升级 Hibernate Search 时未找到 : org. hibernate.search.jpa.FullTextEntityManager 的 ClassLoaders

java - Struts2 从表单获取数据到一个单独的类中

c# - 为什么我的 WCF 服务一次只处理 3 个并行请求?

java - 为什么 wait、notify 和 notifyAll 是 Object 类中的方法,不像 Cloneable

java - 尽管条件值发生变化,但循环并未停止

java - Java中 "wait()"与 "sleep()"之间的区别

exception - Java 编译器是设计成这样工作还是有限制?

java - Mockito:在另一个方法中模拟方法调用

.net - 了解 Azure Functions 行为

c++ - grpc & protobuf -- 错误:std::result_of<> 中没有名为 'type' 的类型