Fork/Join pool et Décomposition Récursive d'un problème en vue de sa parallèlisation.
En supposant les deux méthodes suivantes,
public class Reducer {
public static void sum(int[] array) {
var sum = 0;
for(var value: array) {
sum += value;
}
return sum;
}
public static void max(int[] array) {
var max = Integer.MIN_VALUE;
for(var value: array) {
max = Math.max(max, value);
}
return max;
}
}
-
Quelles est la signature d'une méthode reduce qui prend plusieurs paramètres dont le tableau d'entier et
un paramètre qui aura au choix soit la valeur Integer::sum soit la valeur Math::max
de telle façon à pouvoir ré-écrire les méthodes sum et max comme des appels à la méthode reduce ?
-
Ecrire la méthode publique reduce et changer le code des méthodes sum et max pour utiliser la méthode reduce
-
Ecrire un main de test qui tire au sort un million d'élément dont les valeurs sont comprises en 0 et 1_000
et stoque ces éléments dans un tableau d'entier puis appels les méthodes sum et max et affiche les valeurs retrounées.
Note: On utilisera pour cela la classe java.util.Random et sa méthode ints().
Note2: Comment fait on si les valeurs sont random pour toujours tirer le même tableau de valeurs ?
On souhaite implanter une classe
ForkJoinCollections permettant de faire un reduce sur n'importe qu'elle collection.
Pour parcourir et découper la collection en deux, on utilisera l'interface
Spliterator.
On partira du code suivant
public class ForkJoinCollections {
public static <V, T> V forkJoinReduce(Collection<T> collection, int threshold, V initialValue,
XXX accumulator, YYY combiner) {
return forkJoinReduce(collection.spliterator(), threshold, initialValue, accumulator, combiner);
}
private static <V, T> V forkJoinReduce(Spliterator<T> spliterator, int threshold, V initialValue,
XXX accumulator, YYY combiner) {
// TODO
}
public static void main(String[] args) {
// sequential
System.out.println(IntStream.range(0, 10_000).sum());
// fork/join
var list = IntStream.range(0, 10_000).boxed().collect(Collectors.toList());
var result = forkJoinReduce(list, 1_000, 0, (acc, value) -> acc + value, (acc1, acc2) -> acc1 + acc2);
System.out.println(result);
}
}