Junior — Middle
Quais métodos podem ser usados para implementar a soma paralela dos elementos de um array usando ForkJoinPool?
sobes.tech IA
Resposta da IA
Para calcular a soma dos elementos de um array em paralelo usando ForkJoinPool, pode-se implementar uma tarefa recursiva que divide o array em partes e soma-as em paralelo.
Ideia principal:
- Se o tamanho do subarray for pequeno, calcula-se a soma diretamente.
- Caso contrário, divide-se o subarray em duas partes, cria-se duas sub-tarefas, executa-se-as em paralelo e combina-se os resultados.
Exemplo em Java usando 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(); // inicia a tarefa esquerda de forma assíncrona
int rightResult = rightTask.compute(); // calcula a tarefa direita no thread atual
int leftResult = leftTask.join(); // espera pelo resultado da tarefa esquerda
return leftResult + rightResult;
}
}
}
// Uso:
// ForkJoinPool pool = new ForkJoinPool();
// int[] data = ...;
// int totalSum = pool.invoke(new SumTask(data, 0, data.length));
Esta abordagem utiliza eficientemente o multithreading para acelerar o cálculo da soma de um array grande.