TP 13 Java

Richard Grin (grin@unice.fr) Retour TPs

Exercice 1 : Juste pour se chauffer...

Un "compteur" a un nom (Toto par exemple) et il compte de 1 à n (nombre entier positif quelconque). Il marque une pause aléatoire entre chaque nombre (de 0 à 5000 millisecondes par exemple).

Un compteur affiche chaque nombre (Toto affichera par exemple, "Toto : 3") et il affiche un message du type "*** Toto a fini de compter jusqu'à 10" quand il a fini.

Ecrivez la classe compteur et testez-la en lançant plusieurs compteurs qui comptent jusqu'à 10. Voyez celui qui a fini le plus vite.

Correction

Compteur.java


Exercice 2 : Tris parallèles

Voici un algorithme de tri en ordre croissant d'une tranche de tableau comprise entre les éléments d'indices debut et fin :

trier(debut, fin) {
  si (fin - debut < 2) { // on a fini, pas d'appel récursif
    si (t[debut] > t[fin])
      echanger(t[i], t[j])
  }
  sinon {
    milieu = (i + j) / 2
    trier(debut, milieu)
    trier(milieu + 1, fin)
    triFusion(milieu) // tri fusion des 2 moitiés de la tranche du tableau
  }
}

On remarque que les 2 tris qui sont effectués avant la fusion sont indépendants l'un de l'autre et il est donc facile des les faire exécuter en parallèle par 2 threads.

Voici une version Java mono-tâche de cet algorithme. Vous pouvez coder votre propre version si vous le souhaitez.

En utilisant la méthode join(), codez une version multi-tâche de cet algorithme. Si vous lancez des threads depuis la méthode main(), n'oubliez pas d'attendre la fin de leur exécution avant d'afficher le résultat final (ceux pour lequel le tableau "trié" s'affiche tel qu'il était au début, pas trié, me comprendront !).

Voici un squelette de classe que vous pouvez utiliser.

Correction

Trieur.java


Exercice 3 :

Modifiez le code de Trieur pour qu'il hérite de Runnable et pas de Thread. Testez.

Correction

Trieur.java


Exercice 4 :

Codez une nouvelle version en utilisant cette fois-ci wait() - notify() au lieu de join().

Relancez plusieurs fois (au moins une dizaine de fois) votre programme pour essayer de repérer des éventuels problèmes liés au multi-tâche.

Correction

Trieur.java


Exercice 5 :

Si votre programme de l'exercice précédent marche parfaitement, bravo !

Pour vous montrer tout de même le type de problème que l'on peut rencontrer avec la programmation de plusieurs tâches, voici une classe qui induit ce type de problème. Lancez-la plusieurs fois jusqu'à obtenir un mauvais fonctionnement (blocage du programme).

Expliquez le problème et donnez une solution (vous l'avez peut-être déjà donnée dans votre programme de l'exercice précédent).

Correction

(C'est la même correction que l'exercice précédent)
Trieur.java


Pour ceux qui ont déjà fini....

Exercice 6 : Produit de 2 matrices en multi-tâches

Rappel : (Aij) . (Bkl) = (Pmn) avec Pmn = S (Amj . Bjn)

On remarque que les calculs des Pmn sont indépendants les uns des autres. On peut donc facilement effectuer ces calculs en parallèles.
Ecrivez une classe Matrice (n'implantez que les méthodes utiles pour effectuer le produit de 2 matrices en parallèle).

Correction

Matrice.java