Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →