:: Enseignements :: ESIPE :: E4INFO :: 2014-2015 :: Java Réseau I - Concurrence et E/S ::
[LOGO]

TP noté de Concurrence - Juillet 2015


Le TP consiste à implanter de différentes façons une classe thread safe Votation qui permet à plusieurs threads de voter de façon concurrente puis de récupérer la moyenne des votes des différentes threads.
La moyenne se calcul en faisant la somme de toute les valeurs divisés par le nombre de fois qu'il y a eu un vote.
Rappel: La moyenne n'est pas une opéartion associative, la moyenne de 3 valeurs n'est pas la même chose que la moyenne entre une valeur et la moyenne entre les deux autres valeurs.
Rappel, vous devez configurer le workspace d'eclipse (File > Switch WorkSpace) pour qu'il corresponde au répertoire EXAM que vous avez dans le home de votre session de TP noté.

Exercice 1 - Votation (12)

On cherche à écrire une classe thread safe permettant à plusieurs threads de faire un vote en envoyant un entier grâce à la méthode vote et permettant à une thread de récupérer la moyenne des votes à un instant donné en utilisant la méthode average.
L'API de la classe Votation est donc la suivante:
    public class Votation {
      /** Vote with an integer value.
       *  @param value the value of the vote.
       *  @throws IllegalArgumentException if the value is not between 0 and 100 included.
       */
      public void vote(int value) { ... }
  
      /** Returns the average value of all the votes.
       *  @return the average value of all the votes.
       *  @throws IllegalStateException if no vote was ever sent.
       */
      public double average() { ... }
    }
    

  1. Ecrire le code de la classe Votation sans utiliser les classes de l'API java.util.concurrent et ses sous packages.
  2. Ecrire dans la classe Votation un main de test qui
    • Crée un tableau de 10 threads (numéroté de 0 à 9), chacune d'elle fera un vote avec comme entier son numéro
    • Démarre les 10 threads
    • La thread main sera mis en attente jusqu'à ce que les 10 threads aient fini leur travail.
    • Puis la thread main affichera la moyenne des votes (4.5).
  3. Créer une nouvelle classe LockedVotation faisant la même chose que la classe Votation mais en utilisant les verrous de l'API java.util.concurrent.locks.
    Noter que vous pourrez tester la classe LockedVotation avec une méthode main ayant exactement le même code que la méthode main de la classe Votation.
  4. Enfin, créer une nouvelle classe AtomicVotation faisant la même chose que la classe Votation mais en utilisant uniquement les opérations atomiques de l'API java.util.concurrent.atomic.
    Note: réflechir AVANT de coder, SVP !

Exercice 2 - WaitingVotation (8)

On cherche maintenant à écrire une nouvelle classe WaitingVotation ayant deux méthodes:
  • une méthode vote qui permet de voter de la même façon qu'avec la classe Votation mais qui, une fois le vote fait, va attendre la fin du vote. Une fois le vote terminé, la méthode renverra la moyenne des valeurs des votes.
  • une méthode endVotation qui permet d'indiquer la fin du vote en terminant celui-ci.
Comme chaque méthode vote renvoie la moyenne des votes, la méthode average n'existe plus dans la classe WaitingVotation
Contrairement à la classe Votation, la classe WaitingVotation interdit à une même thread de puvoir voter plusieurs fois en appelant la méthode vote, dans ce cas, l'exception IllegalStateException sera levée lors d'un second vote.
Enfin, une fois le vote terminé par l'appel à endVotation, un futur appel à la méthode vote ou à la méthode endVotation par n'importe qu'elle thread est interdit (l'exception IllegalStateException sera levée).

  1. Ecrire le code de la classe WaitingVotation
    (vous êtes libre de repartir soit du code de Votation soit du code de LockedVotation).
  2. Ecrire un main de test qui de la même façon que pour la classe Votation crée 10 threads qui chacune vote avec leur numéro, une fois toutes les threads démarrées, la thread main va se mettre en attente pendant 1 seconde puis elle fermera le vote en appelant la méthode endVotation. Les 10 threads afficheront alors la moyenne du vote (qui devrait être la même :)).