Рассмотрите коллекцию из 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();
}
}
В методе changeState() есть побочный эффект, поэтому я не уверен, что это сработает, я не могу реорганизовать, чтобы сделать что-то больше в стиле функционального кода из-за сложности, я упростил пример, чтобы упростить понимать. Извините, я не акцентировал зависимость от побочного эффекта, который вызывает изменение зависимого состояния в каждом цикле цикла while. – newlogic