[t]40ex
UniversitéPierre & Marie Curie
U.F.R d'infomatique
[t]45ex
Maîtrise -- 2000-01
Programmation Objet et Distribution



Tavaux dirigés n° 8




Exercice I Threads indépendants.


Question (I.1) Déclarer deux classes Ping et Pong étendant la classe Thread dont la méthode run est une boucle sans fin qui affiche, respectivement,"ping" et "PONG" puis attend un peu avant de recommencer.


Question (I.2) Déclarer une classe Go comprenant la méthode main qui lance une instance de Ping et une instance de Pong.




Exercice II Threads synchronisés.


Question (II.1) Déclarer une classe Sem pour implanter un sémaphore simple. La classe Sem contient un champ booléen curVal et deux méthodes (get et set). La première méthode prend en argument une valeur booléenne val et attend que le champs curVal soit égal àval. Lorsque c'est le cas, elle renvoie la valeur true. La seconde méthode prend en argument une valeur booléenne pour modifier celle de curVal et signale la modification. Ces deux méthodes doivent définir des sections critiques.


Question (II.2) Définir ànouveau les classes Ping et Pong de façon àce qu'elles se synchronisent en utilisant un sémaphore de la classe Sem ci-dessus.


Question (II.3) Redéfinir la classe Go.




Exercice III Producteur-consommateur.


Question (III.1) Définir une classe Stock contenant quatre champs : La classe Stock offre quatre méthodes :
Question (III.2) Définir une classe Prod (pour le producteur) qui étend la classe Thread. Le producteur produira un nombre fini de produits. Sa méthode run boucle sur la séquence :
  1. ajouter un produit au stock;
  2. afficher;
  3. attendre.
Et ce, jusqu'àce que le nombre d'éléments à produire soit atteint. Il ferme alors le stock.


Question (III.3) Définir une classe Cons (pour le consommateur) dont la méthode run boucle infiniment sur la séquence :
  1. prendre un produit dans le stock;
  2. afficher;
  3. attendre.
La sortie de boucle est provoquée par l'exception StockClosed.


Question (III.4) Écrire une classe Go pour tester.




Exercice IV Priorités.

On veut simuler une gestion un peu équitable de processus.


Question (IV.1) Écrire un classe Shared contenant un tableau d'entiers et offrant deux méthodes : synchronized int[] getBounds() qui founit (dans un tableau de deux entiers) l'indice des éléments maximal et minimal : synchronized int access(int i) qui incrémente et retourne la ième case du tableau. Chacune des cases du tableau servira de compteur pour autant de processus.


Question (IV.2) Écrire une classe Proc qui encapsule une instance de Shared (disons ns) et un entier (disons i). Elle étendra Thread et sa méthode run est une boucle sans fin qui se contente d'accéder (selon la méthode access) au i-ième élément du tableau que contient ns.


Question (IV.3) Écrire une classe Monit, qui étend Thread et dont la méthode run crée une instance de Shared et autant de processus, puis assure l'équitéentre ces processus selon le principe suivant : régulièrement, le processus dont le compteur est minimal reçoit une prioritémaximal (moins 1), les autres, une prioritéminimale. On affichera aussi régulièrement la valeur de la différence entre maximal et minimal. On assure ainsi que la différence entre les compteurs ne varie pas trop.


Question (IV.4) Écrire une classe Go contenant une méthode main qui lance le moniteur avec une prioritémaximale.


Question (IV.5) (Àréaliser sur machine) Implantez les classes ci-dessus et faite tourner. Écrivez une version laxiste du moniteur qui ne modifie pas les priorités (égales pour tous par défaut). Faites tourner. Qu'en conclure ?




This document was translated from LATEX by HEVEA.