:: Enseignements :: Master :: Master TTT :: 2012-2013 :: Programmation réseau en Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Programmation concurrente en Java (acte I) |
Ce TD propose une première approche à l'utilisation de threads en Java par l'implantation de quelques threads simples ainsi qu'une introduction aux problématiques de synchronisation.
Exercice 1 - Premier programme concurrent
Nous souhaitons réaliser un programme comportant plusieurs threads, chacune incrémentant la cellule d'un tableau.
- Thread principale. Créer un programme initialisant un tableau de n cellules de long et affichant régulièrement (toutes les 5 secondes par exemple) son contenu (on peut utiliser la méthode statique Arrays.toString(long[] tab)). La mise en sommeil de la thread est possible avec la méthode statique Thread.sleep(long millis). On notera que pour l'instant il n'y a pas trop de suspens : le contenu du tableau reste nul (aucune modification n'est réalisée). Faire en sorte qu'à l'issue d'un temps déterminé le programme s'arrête (utiliser System.nanoTime() pour capturer le temps de départ et calculer ensuite les temps écoulés).
- Threads d'incrémentation. On créé maintenant n threads (une par cellule du tableau de long), chacune réalisant une boucle d'incrémentation. On vérifiera également si la thread est interrompue : dans cette situation, on sortira de la boucle (et donc de la méthode run()). Ces threads sont initialisées et démarrées depuis la thread principale. Celle-ci affiche toujours sur la sortie standard le contenu du tableau (on peut ainsi déterminer le rythme d'exécution des threads en comparant les compteurs). À l'issue d'un temps déterminé, la thread principale se termine sans avoir oublié auparavant d'interrompre toutes les threads d'incrémentation.
- Lancer jconsole et examiner lors d'une exécution du programme les threads en présence.
- Quelle conséquence a la mise en mode démon des threads d'incrémentation (setDaemon(true)) ? Aurait-on besoin d'interrompre les threads d'incrémentation ? Mais cela serait-il finalement une bonne idée ?
Exercice 2 - Point de cohérence ?
On souhaite créer un programme avec plusieurs threads, chacune modifiant un objet Point : l'une place ses coordonnées à (0, 0), l'autre à (1,1), une autre à (2,2)... La thread principale affiche régulièrement la valeur instantanée du point.
- Créer une classe Point comprenant deux champs entiers pour spécifier des coordonnées dans un espace à 2 dimensions.
- Initialiser et démarrer plusieurs threads auxquelles on confiera une réference vers le même point qu'elles mettront concurremment à jour avec leur identifiant (0, 1, 2...). On affichera avec la thread principale régulièrement la valeur du point. Obtient-t-on toujours des points uniformes (avec x=y) ?
- Proposer une solution pour résoudre le problème soulevé en utilisant :
- des blocs synchronized
- un verrou
© Université de Marne-la-Vallée