:: Enseignements :: ESIPE :: E4INFO :: 2016-2017 :: Concurrence ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | TP noté de Concurrence |
Le but de ce TP noté est de modifier les classes indiquées afin
de vérifier que vous maitrisez les bases des mécanismes de protection
de code exécuté de manière concurrente.
Vos sources Java produites pendant le TP devront être placées sous le répertoire
EXAM de votre compte ($HOME) (qui est vierge dans l'environnement de TP noté);
sinon, elles ne seront pas récupérées.
Tout document papier est proscrit.
Vous pouvez consulter la javadoc à travers Eclipse (onglet Javadoc) ou en lançant la commande
jdoc dans un shell.
Les seuls documents électroniques autorisés sont les supports de cours à l'url
http://igm.univ-mlv.fr/~forax/ens/java-avance/cours/pdf/.
Les deux exercices sont complètement indépendants et peuvent être traités dans n'importe quel ordre.
Exercice 1 - PriorityManager
Le but de cet exercice est d'implanter une classe
PriorityManager qui permet
d'associer à un code une priorité qui sera sa priorité d'exécution.
La priorité est un entier, 0 veut dire très prioritaire et donc à exécuter en premier,
4 veut dire non prioritaire et donc à exécuter en dernier.
La classe possède deux méthodes
-
add qui permet d'enregistrer un code avec sa priorité.
On interdit d'enregistrer deux codes pour une même priorité.
-
executeAll qui débute l'execution dans un nouveau thread de l'ensemble des codes qui ont été enregistrés avec add
(executeAll rend la main tout de suite). Dès que executeAll a rendu la main, le manager doit
pouvoir être ré-utilisé; les add suivants sur ce PriorityManager ne
doivent pas avoir d'incidence sur l'exécution des codes précédents.
Un de vos collègues, Kenny, a déjà écrit
un prototype de la classe
malheureusement, il est passé sous un bus avant d'avoir pu terminer celui-ci.
De fait, le fichier source ne compile même pas.
-
Modifier la classe de Kenny en remplacant le type XXX par ce qu'il faut. La classe devrait alors compiler.
-
Implanter les méthodes add et executeAll de la classe PriorityManager
sachant que la classe doit être thread-safe.
-
Assurez vous que dès que la méthode executeAll est appelée pour exécuter un ensemble de codes,
tout nouvel appel à add est sans effet sur l'exécution de cet ensemble, mais concerne l'ensemble de codes suivant.
Exercice 2 - ComputationGroup
Le but de cet exercice est d'implanter une classe gérant un ensemble de calculs (Computation)
qui seront exécutés dans plusieurs threads et pourront être arrétés.
La classe
ComputationGroup possède deux méthodes
-
executeAsync qui demande l'exécution d'un calcul (Computation) dans une nouvelle thread.
Cette méthode retourne aussi une Computation, mais dont la méthode result() bloque si on l'appelle
alors que le résultat du calcul correspondant (passé en argument à executeAsync) n'a pas fini d'être calculé;
sinon, result() renvoie le résultat du calcul.
Note: executeAsync ne doit pas attendre la fin du calcul pour rendre la main.
-
stopAll qui arrête l'ensemble des calculs qui ont été démarrés par executeAsync.
Pour tous les calculs arrêtés avant d'avoir fini, un appel à la méthode result() de la Computation
renvoyée par la méthode executeAsync devra lever l'exception InterruptedException qui a été levée lorsque
le calcul a été arrété.
La classe
ComputationGroup doit être
thread-safe !
Keny étant cette fois ci passé sous un train, il vous a laissé comme à son habitude, ha sacré Kenny,
un
code pas fini.
-
Implanter la méthode executeAsync.
-
Implanter la méthode stopAll.
Dans un premier temps, on ne vous demande pas qu'une instance de la classe puisse être ré-utilisable une fois stopAll appelée.
-
Modifier le code de la classe pour qu'il soit possible de réutiliser une instance de celle-ci après un appel
à stopAll.
© Université de Marne-la-Vallée