Sobes.tech
Junior — Middle

Quelles méthodes peuvent être utilisées pour réaliser le calcul parallèle de la somme des éléments d'un tableau en utilisant ForkJoinPool?

sobes.tech IA

Réponse de l'IA

Pour effectuer un calcul parallèle de la somme des éléments d’un tableau à l’aide de ForkJoinPool, on peut implémenter une tâche récursive qui divise le tableau en parties et les somme en parallèle.

Idée principale :

  • Si la taille du sous-tableau est petite, on calcule la somme directement.
  • Sinon, on divise le sous-tableau en deux parties, on crée deux sous-tâches, on les exécute en parallèle et on combine les résultats.

Exemple en Java avec 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(); // lance la tâche gauche de manière asynchrone
            int rightResult = rightTask.compute(); // calcule la tâche droite dans le thread actuel
            int leftResult = leftTask.join(); // attend le résultat de la tâche gauche
            return leftResult + rightResult;
        }
    }
}

// Utilisation :
// ForkJoinPool pool = new ForkJoinPool();
// int[] data = ...;
// int totalSum = pool.invoke(new SumTask(data, 0, data.length));

Cette approche utilise efficacement le multithreading pour accélérer le calcul de la somme d’un grand tableau.