:: Enseignements :: ESIPE :: E4INFO :: 2013-2014 :: Java Réseau I - Concurrence et E/S ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | TP noté de Concurrence - Session de Juillet |
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.
Vous devez aussi configurer votre Eclipse (eclipse-lambda) pour utiliser la version
8 du JRE (qui est disponible ici /usr/local/apps/java8) et le compilateur
pour qu'il utilise la version 1.8.
Tout document papier autre que ce que vous avez imprimé vous-même est proscrit.
Vous pouvez consulter la javadoc à travers eclipse 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 exercices 1, 2 et 3 sont complètement indépendants et peuvent être traités
dans n'importe quel ordre.
Exercice 1 - Ajout en parallèle
Le code suivant cherche à ajouter 4 fois les nombre de 0 à 4 999 en parallèle
dans la liste
list.
Mais ce code ne marche pas
ArrayList<Integer> list = new ArrayList<>();
IntStream.range(0, 4).forEach(i -> {
new Thread(() -> {
for(int j = 0; j < 5_000; j++) {
list.add(j);
}
}).start();
});
-
Que se passe t'il lorsque l'on exécute le code ? (si il ne se passe rien, ré-exécuter le :)
Modifier le code pour le rendre thread-safe.
Attention, l'ajout doit toujours se faire en parallèle.
Exercice 2 - Le déjeuner des philosophes
La situation est la suivante :
Cinq philosophes (initialement mais il peut y en avoir beaucoup plus) se trouvent autour d'une table ronde ;
chacun des philosophes a devant lui un plat de spaghetti ;
à gauche de chaque plat de spaghetti se trouve une fourchette.
Pour pouvoir manger, un philosophe doit prendre deux fourchettes, celle à sa droite et celle à sa gauche.
Un de vos collègues propose le code suivant:
-
Quel est le problème du code ci-dessus ?
Si vous ne voyez pas, vous n'avez qu'à l'exécuter.
-
Modifier le code pour corriger le problème.
Note: oui, il existe plusieurs façons, une seule me suffira :)
Exercice 3 - Mountain Train
Nous allons simuler le fonctionnement d'un train des montagnes, dans lequel les passagers
peuvent monter (
getOn) en indiquant leur nom et peuvent sortir une fois arriver à destination,
donc tous ensembles (
getAllOff), dans ce cas, les noms de tous les passager sont ajoutés
à la liste passée en paramètre.
-
Dans un premier temps, expliquer en commentaire de la classe pourquoi celle-ci n'est pas thread safe
en donnant un exemple.
-
Modifier le code de la classe pour la rendre thread-safe.
-
Au lieu de jeter une exception lorsque le train est complet, faite en sorte que les threads ayant appelées
getOn soit mises en attente jusqu'à ce que le train soit vidé.
Modifier le code de la classe en conséquence.
-
Avant de poursuivre, recopier le code dans une classe MountainTrain2.
On souhaite maintenant que l'appel à getAllOf soit bloquant si il reste encore des places dans le train.
L'appel sera débloqué une fois le train plein.
Modifier le code de la classe MountainTrain2en conséquence.
© Université de Marne-la-Vallée