L'examen est composé d'une partie écrite sur feuille de 45 minutes maximum, à faire en premier et d'un exercice qui doit être traité ensuite.
Rappel : si ce n'est pas déjà le cas, vous devez configurer le workspace d'Eclipse (File > Switch WorkSpace) pour qu'il corresponde au répertoire EXAM présent dans le home de votre session de TP noté.
Vérifier que tous vos fichiers sont bien dans le répertoire EXAM. Tout ce qui n'est pas dans ce répertoire est perdu quand vous vous déconnectez.
La javadoc 25 est là : https://igm.univ-mlv.fr/~juge/javadoc-25/.
Vous avez le droit de consulter les transparents du cours pendant tout l'examen.
Les classes de cet exercice doivent être dans package fr.uge.concurrence.exo1.
Dans cet exercice, on cherche à simuler une capacity) et a une longueur (length) donnée. Pour traverser en utilisant la corde, un lémurien commence à la position 0 (quand il entre sur la corde), puis passe à la position 1, et ainsi de suite. Lorsqu'il atteint la position length, c'est qu'il est sorti de la corde.
On va créer une classe thread-safe SafeRope qui va permettre à plusieurs threads, représentant les lémuriens, de traverser sur la corde. La classe SafeRope possède une méthode enter() permettant aux lémuriens de rentrer sur la corde. S'il y a déjà capacity lémuriens sur la corde, la méthode bloque jusqu'à ce qu'il y ait à nouveau de la place sur la corde. La classe possède également une méthode advance(), permettant au thread-lémurien qui l'appelle d'avancer d'une position quand il le désire. La méthode advance() renvoie un boolean qui indique si le lémurien est arrivé de l'autre côté (true) ou s'il est toujours sur la corde (false).
L'exercice comporte 6 questions.
Écrire la classe thread-safe SafeRope, avec la capacité maximale et la longueur de la corde données en argument du constructeur, ainsi que les méthodes enter() et advance() avec des blocs synchronized. Remarquez que les méthodes enter() et advance() ne prennent pas de paramètre.
On suppose, dans un premier temps, que plusieurs lémuriens peuvent se trouver à la même position sur la corde.
Dans la classe SafeRope écrire une méthode main qui crée un objet SafeRope, avec une capacité de 3 et de longueur 6, et qui démarre 10 threads, correspondant chacun à un lémurien. Chaque thread entre dans la corde, et avance jusqu'à atteindre l'autre côté de la corde et s'arrête ensuite. Chaque thread affiche ses actions (démarrage, entrée sur la corde, avancement d'une position, sortie).
Entre chaque étape les threads appellent la méthode waitRandom() pour attendre un temps aléatoire.
Le programme doit finir par s'arrêter.
public static void waitRandom() throws InterruptedException {
Thread.sleep(500 + Math.abs(ThreadLocalRandom.current().nextInt() % 500));
}
Vous devriez avoir un affichage similaire à ceci :
Lemur 3 just arrived Lemur 3 entered the cord Lemur 3 in position 0 Lemur 7 just arrived Lemur 1 just arrived Lemur 5 just arrived Lemur 2 just arrived Lemur 8 just arrived Lemur 9 just arrived Lemur 6 just arrived Lemur 3 in position 1 Lemur 7 entered the cord Lemur 7 in position 0 Lemur 4 just arrived Lemur 0 just arrived Lemur 3 in position 2 Lemur 7 in position 1 Lemur 1 entered the cord Lemur 1 in position 0 Lemur 3 in position 3 Lemur 7 in position 2 ... Lemur 6 is out Lemur 4 in position 5 Lemur 0 in position 3 Lemur 4 is out Lemur 0 in position 4 Lemur 0 in position 5 Lemur 0 is out
Copier votre classe SafeRope dans une classe SafeRopeRL et réécrivez-la en utilisant des ReentrantLock.
Pour réaliser une étude, un biologiste voudrait avoir accès aux statistiques du nombre de lémuriens qui attendent pour entrer sur la corde, ceux qui se trouvent sur la corde et combien ont traversé la corde entière. Le biologiste est représenté un nouveau thread qui affichera les statistiques toutes les 1000 ms. Modifier le code de SafeRopeRL pour obtenir ce comportement. Le programme doit toujours finir par s'arrêter.
BBiologist just arrived Biologist: 0 Lemurs waiting, 0 Lemurs on the rope, 0 full crossings Lemur 5 just arrived Lemur 5 entered the cord Lemur 5 in position 0 Lemur 7 just arrived Lemur 8 just arrived Lemur 1 just arrived Lemur 4 just arrived Lemur 9 just arrived Lemur 5 in position 1 Lemur 7 entered the cord Lemur 7 in position 0 Lemur 3 just arrived Lemur 6 just arrived Lemur 0 just arrived Lemur 2 just arrived Biologist: 8 Lemurs waiting, 2 Lemurs on the rope, 0 full crossings Lemur 5 in position 2 Lemur 7 in position 1 Lemur 8 entered the cord Lemur 8 in position 0 Lemur 5 in position 3 Biologist: 7 Lemurs waiting, 3 Lemurs on the rope, 0 full crossings Lemur 7 in position 2 Lemur 5 in position 4 Lemur 8 in position 1 Biologist: 7 Lemurs waiting, 3 Lemurs on the rope, 0 full crossings Lemur 7 in position 3 Lemur 8 in position 2 Lemur 5 in position 5 Biologist: 7 Lemurs waiting, 3 Lemurs on the rope, 0 full crossings Lemur 1 entered the cord Lemur 1 in position 0 Lemur 5 is out Lemur 7 in position 4 Lemur 8 in position 3 Lemur 7 in position 5 Lemur 1 in position 1 Biologist: 6 Lemurs waiting, 3 Lemurs on the rope, 1 full crossings Lemur 8 in position 4 ... Lemur 2 in position 5 Biologist: 0 Lemurs waiting, 1 Lemurs on the rope, 9 full crossings Lemur 2 is out
Techniquement, il n'est pas possible pour deux lémuriens d'occuper la même position sur la corde. Par conséquent, si un lémurien veut atteindre une position occupée, il doit attendre qu'elle se libère.
Modifier la classe SafeRopeRL pour implanter ce comportement.
On veut maintenant changer le comportement du thread biologiste. On voudrait qu'au lieu d'attendre 1000 ms entre chaque affichage, il fasse son affichage quand au moins un nouveau lémurien est sorti de la corde. Modifier la classe SafeRopeRL et sa méthode main pour obtenir ce comportement. Le programme doit toujours finir par s'arrêter.
Biologist just arrived Lemur 6 just arrived Lemur 6 entered the cord Lemur 6 in position 0 Lemur 7 just arrived Lemur 4 just arrived Lemur 2 just arrived Lemur 1 just arrived Lemur 5 just arrived Lemur 8 just arrived Lemur 0 just arrived Lemur 9 just arrived Lemur 3 just arrived Lemur 6 in position 1 Lemur 7 entered the cord Lemur 7 in position 0 Lemur 6 in position 2 Lemur 7 in position 1 Lemur 4 entered the cord Lemur 4 in position 0 Lemur 6 in position 3 Lemur 7 in position 2 Lemur 4 in position 1 Lemur 6 in position 4 Lemur 7 in position 3 Lemur 4 in position 2 Lemur 6 in position 5 Lemur 7 in position 4 Lemur 4 in position 3 Lemur 2 entered the cord Lemur 2 in position 0 Lemur 6 is out Biologist: 7 Lemurs waiting, 2 Lemurs on the rope, 1 full crossings Lemur 7 in position 5 Lemur 4 in position 4 Lemur 2 in position 1 Lemur 7 is out Biologist: 5 Lemurs waiting, 3 Lemurs on the rope, 2 full crossings Lemur 1 entered the cord Lemur 1 in position 0 Lemur 4 in position 5 Lemur 2 in position 2 Lemur 1 in position 1 Lemur 4 is out Lemur 5 entered the cord Lemur 5 in position 0 Biologist: 4 Lemurs waiting, 3 Lemurs on the rope, 3 full crossings Lemur 2 in position 3 Lemur 1 in position 2 Lemur 5 in position 1 Lemur 2 in position 4 Lemur 1 in position 3 Lemur 5 in position 2 Lemur 2 in position 5 Lemur 1 in position 4 Lemur 5 in position 3 Lemur 2 is out Lemur 8 entered the cord Lemur 1 in position 5 Biologist: 3 Lemurs waiting, 3 Lemurs on the rope, 4 full crossings Lemur 8 in position 0 Lemur 5 in position 4 Lemur 8 in position 1 Lemur 1 is out Lemur 0 entered the cord Lemur 0 in position 0 Biologist: 2 Lemurs waiting, 3 Lemurs on the rope, 5 full crossings Lemur 5 in position 5 Lemur 8 in position 2 Lemur 0 in position 1 Lemur 5 is out Lemur 9 entered the cord Lemur 9 in position 0 Biologist: 1 Lemurs waiting, 3 Lemurs on the rope, 6 full crossings Lemur 8 in position 3 Lemur 0 in position 2 Lemur 9 in position 1 Lemur 8 in position 4 Lemur 0 in position 3 Lemur 9 in position 2 Lemur 8 in position 5 Lemur 0 in position 4 Lemur 9 in position 3 Lemur 8 is out Lemur 3 entered the cord Lemur 3 in position 0 Biologist: 0 Lemurs waiting, 3 Lemurs on the rope, 7 full crossings Lemur 0 in position 5 Lemur 9 in position 4 Lemur 3 in position 1 Lemur 0 is out Biologist: 0 Lemurs waiting, 2 Lemurs on the rope, 8 full crossings Lemur 9 in position 5 Lemur 3 in position 2 Lemur 9 is out Biologist: 0 Lemurs waiting, 1 Lemurs on the rope, 9 full crossings Lemur 3 in position 3 Lemur 3 in position 4 Lemur 3 in position 5 Lemur 3 is out Biologist: 0 Lemurs waiting, 0 Lemurs on the rope, 10 full crossings