Exercice 1 - Exécutions concurrentes
Écrire une classe AffConcur qui étend la classe Thread. Cette classe possède comme champ un entier identifiant chaque instance. Sa méthode run() affiche, dans une boucle de longueur n fixe, un message indiquant le numéro du processus léger courant et l'indice de la boucle.
Écrire un programme qui crée deux instances de la classe AffConcur et qui les démarre, après quoi elle affiche dans une boucle de même longueur n un message indiquant ``Processus léger initial'' suivit de l'indice de la boucle.
Réécrire la classe AffConcur de sorte à ce qu'elle hérite son numéro d'identifiant de la classe SerialNumber dont le constructeur sans arguments génère automatiquement à chaque instance un numéro de série unique (vous devez commencer par écrire cette classe qui n'a pas de méthode).
Exercice 2 - Problèmes d'exclusion mutuelle
Écrire une classe Point avec deux champs entiers x et y, une méthode void moveTo(int x, int y) (qui déplace le point aux coordonnées passées en argument) et une méthode toString() qui affiche ce point au format (x,y).
Écrire une classe Init destinée à être exécutée dans un processus léger (Thread), c'est-à-dire implantant l'interface Runnable. Cette classe Init contient un constructeur à deux arguments Init(Point p, int val). Sa méthode run() déplace p en (val,val), puis affiche le point, et ce dans une boucle infinie.
Créer deux processus légers ayant pour cible (code à exécuter) deux objets de la classe Init construits avec le même point p et des valeurs différentes (par exemple, Init(p,1) pour l'un et Init(p,2) pour l'autre).
Démarrer les deux processus légers. Quels sont les différents affichages possibles pour le point? Que faire?
Exercice 3 - Producteur et consommateur
On désire développer une petite application simulant les comportements concurrents d'un ensemble de producteurs et de consommateurs de messages. D'un côté, les producteurs produisent des messages qu'ils stockent dans un buffer commun; de l'autre, les consommateurs récupèrent dans ce même buffer les messages (dans l'ordre où ils y ont été placés).
On doit respecter un certain nombre de contraintes et pouvoir paramétrer l'application:
Écrire les classes Producteur et Consommateur permettant de mettre en oeuvre ces spécifications. On pourra implanter le buffer avec un Vector et chaque message produit doit être aisément identifiable. Chaque producteur et consommateur sera exécuté par un processus léger (Thread) différent, en concurrence avec les autres.
Exercice 4 - Un tri multi-thread
Soit t un tableau à trier. Implanter l'algorithme de tri suivant:
Nicolas.Bedon[at]univ-mlv.fr - Etienne.Duris[at]univ-mlv.fr - © Université de Marne-La-Vallée - Décembre 2000