:: Enseignements :: ESIPE :: E4INFO :: 2013-2014 :: Java Réseau I - Concurrence et E/S ::
[LOGO]

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();
    });
   

  1. 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:

  1. Quel est le problème du code ci-dessus ?
    Si vous ne voyez pas, vous n'avez qu'à l'exécuter.
  2. 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.

  1. Dans un premier temps, expliquer en commentaire de la classe pourquoi celle-ci n'est pas thread safe en donnant un exemple.
  2. Modifier le code de la classe pour la rendre thread-safe.
  3. 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.
  4. 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.