[UMLV]

Threads et exclusion mututelle

Exercice 1 - Un exemple simple de Thread

Ecrire une classe Printer implantant l'interface java.lang.Runnable qui contient un identifiant (entier), une durée et un texte.
La méthode run() se contentera d'afficher toute les durées miliseconds un message contenant l'identifiant suivi du texte

    id 1 - Texte1
    id 2 - Texte2
   
Utiliser Thread.sleep() pour faire patienter le programme.
Ecrire le code qui lance deux instances de la classe Printer dans deux threads différentes.

Exercice 2 - Executor Service

Exercice 3 - Problèmes d'exclusion mutuelle

On cherche à étudier le comportement d'un objet modifié par plusieurs threads.

  1. Écrire une classe Point avec deux champs entiers x et y, une méthode void set(int x, int y) (qui déplace le point aux coordonnées passées en arguments) et une méthode toString() qui affiche ce point au format (x,y) ;
  2. écrire une classe Imp ayant un constructeur prenant en paramètre un Point et un entier i. La classe Imp possède une méthode run() qui démarre un processus léger qui appelle la méthode set(i,i) sur le point puis l'affiche, et ce dans une boucle infinie.

Créer deux instances de la classe Imp construites avec la même instance de Point, p et des valeurs différentes (par exemple, Imp(p,1) pour l'un et Imp(p,2) pour l'autre). Démarrer les deux instances. Quels sont les différents affichages possibles pour le point ? On corrigera ce problème dans la planche de TD suivante .

Exercice 4 - Kill bill

Écrire un programme qui créé et démarre dix processus légers exécutant les méthodes run de dix instances d'une classe Bill implantant Runnable. Chaque processus léger exécutera une boucle infinie affichant un message l'identifiant.
Le but du jeu est qu'un utilisateur tape au clavier l'identifiant d'un processus léger et que celui-ci disparaisse (qu'il soit interromptu) en affichant "ahhhh je meurs" suivi de son identifiant.

Exercice 5 - 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 une file d'attente commune ; 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 :

  1. un producteur ne peut produire un message que si le buffer n'est pas plein et, bien sûr, un consommateur ne peut lire un message que si le buffer n'est pas vide;
  2. le débit de chaque producteur et de chaque consommateur est paramétrable à sa construction (il représente le temps d'attente entre deux productions ou deux consommations).

Écrire les classes Producer et Consumer permettant de mettre en oeuvre ces spécifications. Chaque producteur et consommateur sera exécuté par un processus léger (Thread) différent, en concurrence avec les autres. Vous pouvez utiliser d'autres threads.