programmation Java (école d'ingénieur) · Chapitre 15 · Application directe du cours
Maximum en parallèle
Threads · niveau 2
Énoncé
Écrire une méthode static int maximum(int[] t, int k) qui calcule le maximum du tableau t avec k fils : le fil cherche le maximum de la tranche , où est la longueur du tableau, puis le fil principal combine les résultats. Faut-il un verrou ? Vérifier sur un tableau aléatoire de dix millions d'entiers, pour .
Corrigé
Chaque fil écrit dans sa case du tableau maxTranche : aucune case n'est partagée en écriture, donc pas de verrou. Le join garantit en outre que le fil principal voit les valeurs écrites par les fils terminés.
static int maximum(int[] t, int k) throws InterruptedException {
int[] maxTranche = new int[k]; // chaque fil écrit dans SA case
Thread[] fils = new Thread[k];
for (int j = 0; j < k; j++) {
int de = j * t.length / k, a = (j + 1) * t.length / k; // tranche [de, a)
int numero = j;
fils[j] = new Thread(() -> {
int m = Integer.MIN_VALUE;
for (int i = de; i < a; i++) m = Math.max(m, t[i]);
maxTranche[numero] = m;
});
fils[j].start();
}
for (Thread f : fils) f.join(); // après join, maxTranche est complet
int m = Integer.MIN_VALUE;
for (int x : maxTranche) m = Math.max(m, x);
return m;
}
Sur un tableau de dix millions d'entiers aléatoires (graine ), comparé au maximum calculé par une boucle simple :
k = 1 : 999999672 (correct)
k = 2 : 999999672 (correct)
k = 3 : 999999672 (correct)
k = 4 : 999999672 (correct)
k = 7 : 999999672 (correct)
Les bornes et découpent exactement , même quand ne divise pas : la tranche s'arrête là où commence la tranche . Attention, j * t.length pourrait dépasser la capacité d'un int pour un très grand tableau.
100 % gratuit
La suite du chapitre est sur Adloun
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.