Junior — Middle
Akými metódami je možné realizovať paralelný výpočet súčtu prvkov poľa pomocou ForkJoinPool?
sobes.tech AI
Odpoveď od AI
Pre paralelného výpočtu súčtu prvkov poľa pomocou ForkJoinPool je možné implementovať rekurzívnu úlohu, ktorá delí pole na časti a súčíta ich paralelne.
Hlavná myšlienka:
- Ak je veľkosť podpoľa malá, vypočítame súčet priamo.
- Inak rozdelíme podpole na dve časti, vytvoríme dve podúlohy, spustíme ich paralelne a spojíme výsledky.
Príklad v Jave s 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(); // spustí ľavú úlohu asynchrónne
int rightResult = rightTask.compute(); // vypočíta pravú úlohu v aktuálnom vlákne
int leftResult = leftTask.join(); // čaká na výsledok ľavej úlohy
return leftResult + rightResult;
}
}
}
// Použitie:
// ForkJoinPool pool = new ForkJoinPool();
// int[] data = ...;
// int totalSum = pool.invoke(new SumTask(data, 0, data.length));
Tento prístup efektívne využíva viacvláknové spracovanie na zrýchlenie výpočtu súčtu veľkého poľa.