Junior — Middle
ForkJoinPool колдонуп массивдин элементтеринин жыйындысын параллелдүү эсептөө үчүн кайсы ыкмаларды колдонсо болот?
sobes.tech AI
AIден жооп
ForkJoinPool колдонуп массивдин элементтеринин суммасын параллел эсептөө үчүн, рекурсивдүү тапшырманы ишке ашырууга болот, ал массивти бөлүп, алардын суммасын параллел жүргүзөт.
Негизги идея:
- Эгер кичинекей бөлүк болсо, сумманы түз эсептейбиз.
- Болбосо, бөлүктү экиге бөлүп, эки тапшырманы түзүп, аларды параллел иштетип, натыйжаларды бириктиребиз.
Javaда RecursiveTask<Integer> колдонуу менен мисал:
import java.util.concurrent.*;
public class SumTask extends RecursiveTask<Integer> {
private static final int THRESHOLD = 1000;
private int[] array;
private int start, end;
public SumTask(int[] array, int start, int end) {
this.array = array;
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
int length = end - start;
if (length <= THRESHOLD) {
int sum = 0;
for (int i = start; i < end; i++) {
sum += array[i];
}
return sum;
} else {
int mid = start + length / 2;
SumTask leftTask = new SumTask(array, start, mid);
SumTask rightTask = new SumTask(array, mid, end);
leftTask.fork(); // сол жактагы тапшырманы асинхрон баштоо
int rightResult = rightTask.compute(); // оң жактагы тапшырманы азыркы жипте эсептөө
int leftResult = leftTask.join(); // сол жактагы тапшырманын жыйынтыгын күтүү
return leftResult + rightResult;
}
}
}
// Колдонуу:
// ForkJoinPool pool = new ForkJoinPool();
// int[] data = ...;
// int totalSum = pool.invoke(new SumTask(data, 0, data.length));
Бул ыкма чоң массивдин суммасын эсептөөнү тездетүү үчүн көпжиптүү иштетүүнү эффективдүү колдонуу болуп саналат.