Examen 2h sur machine


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.

QCM (sur papier)

La corde des lémuriens

Les classes de cet exercice doivent être dans package fr.uge.concurrence.exo1.


Dans cet exercice, on cherche à simuler une corde permettant à des lémuriens de passer d'un arbre à un autre. La corde peut accueillir un nombre limité de lémuriens (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.

Vous devriez avoir un affichage similaire à ceci :
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.

Vous devriez avoir un affichage similaire à ceci :
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