Junior — Middle
Quali metodi possono essere utilizzati per implementare il calcolo parallelo della somma degli elementi di un array usando ForkJoinPool?
sobes.tech AI
Risposta dell'AI
Per calcolare in parallelo la somma degli elementi di un array usando ForkJoinPool, si può implementare un compito ricorsivo che divide l'array in parti e le somma in parallelo.
Idea principale:
- Se la dimensione del sottoarray è piccola, calcola direttamente la somma.
- Altrimenti, divide il sottoarray in due parti, crea due sotto-task, li esegue in parallelo e combina i risultati.
Esempio in Java con 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(); // avvia il compito sinistro in modo asincrono
int rightResult = rightTask.compute(); // calcola il compito destro nel thread corrente
int leftResult = leftTask.join(); // attende il risultato del compito sinistro
return leftResult + rightResult;
}
}
}
// Uso:
// ForkJoinPool pool = new ForkJoinPool();
// int[] data = ...;
// int totalSum = pool.invoke(new SumTask(data, 0, data.length));
Questo approccio utilizza in modo efficiente il multithreading per accelerare il calcolo della somma di un grande array.