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() { ... }
}
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).