Вы должны дать своему работнику копию k
. Кроме того, вы не очень много выигрываете, позволяя своим работникам делать только один шаг в сумме. Вы должны создать не больше рабочих, чем у вас есть доступные процессоры (ядра), и дать каждому часть суммы для расчета.
Обратите также внимание, что это все еще оставляет вас с ошибкой sum
, потому что, если два сотрудника прочитают и напишут в него одновременно, один из их результатов будет потерян.
Пусть каждый работник вместо этого сохранит личный sum
, а затем, когда они все закончат, добавьте свои частные суммы вместе в основной поток.
Примерно так:
public class GregoryLeibnizImpl implements Runnable {
private int start;
private int end;
private int sum;
public GregoryLeibnizImpl(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public void run() {
// loop from start to end using your sum algorithm
}
}
Затем измените ваш цикл на что-то вроде этого:
for (int k = 0; k < points; k += points / numthreads) {
Runnable worker = new GregoryLeibnizImpl(k, k + points / numthreads);
executor.execute(worker);
}
Вам необходимо хранить эти рабочие экземпляры где-нибудь, например, список, чтобы вы могли собрать их результаты, как только это будет сделано.