并行实现此最有效的方法是什么?

时间:2016-09-28 15:12:07

标签: java concurrency parallel-processing executorservice fork-join

考虑50,000个对象的集合。 每个对象通过其doWork()方法每次迭代产生10个双精度。

有一个连续的while循环遍历每个50,000个对象和 调用doWork()。 在此之后,必须通过在每个双打上调用process()来处理所创建的10个双打中的每一个。

while循环中的最后一步必须对每次迭代中产生的双精度求和,然后记录输出。

设计是否取决于完成doWork()和process()所需的相对时间?

实现此算法的最快且最有效的CPU方法是什么?

我想使用多核可以帮助很多......

我应该使用ExecutorService还是ForkJoin?

我应该如何分割任务?

List<A> listA = new ArrayList<>();
populateWith50k(listA); // has 50k objects after this line
List<Double> listB = new ArrayList<>();

while(true){

    // causes a side affect, hence a change of state that the remaining code
    // depends on, hence I don't think we can use java streams...
    changeState(); 

    // the below depends on the system state setup above
    for (int i=0;i<listA.size();i++){
        A a = listA.get(i);
        a.doWork();
        populateUsingA(a); // populates listB, each A creates 10 doubles
        for (int j=0;j<listB.size();j++){
            B b = listB.get(j);
            b.process();
        }
        sumAndThenLogValuesInListB(a);
        listB.clear();
    }
}

1 个答案:

答案 0 :(得分:2)

您应该使用并行流。

listA.parallelStream().flatMapToDouble(A::doWork).sum()

将为您提供一次通过while循环的总和。您需要更改doWork以立即输出十个双打,或者引入另一个执行此操作的方法,或者编写更复杂的lambda身体(为了便于阅读,我不建议这样做) )。