1

Рассмотрите коллекцию из 50 000 объектов. Каждый объект, который производит 10 удвоений на итерацию, посредством метода doWork().Каков наиболее эффективный способ реализовать это параллельно?

Существует непрерывный цикл, который проходит через каждый из 50 000 объектов и вызывает doWork(). После этого каждый из 10 созданных удвоений должен быть обработан вызовом process() для каждого из них.

Заключительный шаг внутри цикла 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(); 
    } 
} 

ответ

2

Возможно, вы должны использовать параллельный поток.

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

предоставит вам сумму одного прохода через цикл while. Вам нужно будет изменить doWork, чтобы сразу вывести десять парных или ввести другой метод, который делает это, или написать более сложное тело лямбды, которое это делает (я бы не рекомендовал это для удобочитаемости).

+0

В методе changeState() есть побочный эффект, поэтому я не уверен, что это сработает, я не могу реорганизовать, чтобы сделать что-то больше в стиле функционального кода из-за сложности, я упростил пример, чтобы упростить понимать. Извините, я не акцентировал зависимость от побочного эффекта, который вызывает изменение зависимого состояния в каждом цикле цикла while. – newlogic