:: Enseignements :: Master :: M1 :: 2011-2012 :: Java Avancé ::
[LOGO]

Thread, Interruption et variable de thread


Exercice 1 - Hello Thread

On souhaite créer deux threads exécutant le même code. Pour différencier les deux threads, lors de la construction de celles-ci, un entier unique (id) sera fourni à chacune, 0 pour la première et 1 pour la seconde.
Chaque thread exécutera le même code qui consiste à afficher hello suivi du numéro de la thread ainsi que la valeur d'un compteur indiquant le nombre de fois que la thread a affiché ce message.
Exemple :
    ...
    hello 0 10714
    hello 0 10715
    hello 0 10716
    hello 0 10717
    hello 1 15096
    hello 1 15097
    hello 1 15098
    hello 1 15099
    ...
   

  1. Expliquer sur l'exemple ci-dessus pourquoi le compteur de hello 0 est beaucoup plus petit que le compteur de hello 1.
  2. À quoi sert l'interface Runnable ?
  3. Écrire le programme demandé en créant un Thread et en lui donnant un Runnable dont vous redéfinirez la méthode run()(i.e. new Thread(myRunnable)).
  4. Changer votre code pour que l'on puisse choisir lors de l'exécution du programme (1er paramètre) le nombre de threads que l'on veut lancer en concurrence.
  5. Tester la méthode setPriority(int) de Thread.

Exercice 2 - Coitus interruptus

On souhaite maintenant permettre à l'utilisateur en tapant un nombre d'interrompre la thread ayant cet identificateur.

  1. Expliquer les différences entre les méthodes interrupted et isInterrupted de la classe Thread.
  2. Modifier le code en utilisant un scanner (java.util.Scanner) pour lire sur l'entrée standard des commandes de contrôle (à partir de la thread principale).
    On implante les commandes suivantes :
    • kill ID afin de tuer la thread d'identificateur id. La thread tuée affiche ensuite un message à la fin de son exécution.
    • exit qui tue toutes les threads encore en vie.
  3. Il est possible de surveiller la machine virtuelle avec la commande jconsole (mémoire allouée sur le tas, classes chargées, threads en activité...).
    Lancer cette commande, sélectionner le processus à surveiller et vérifier que les threads sont bien interrompues.

Exercice 3 - Modification d'une variable en concurrence

On souhaite créer deux threads qui changent le même champ d'un même objet :

  1. Qu'affiche le code suivant avec la ligne de commande : java Test ?
    Expliquer.
  2. Pourquoi l'affichage n'évolue plus au bout d'un laps de temps ?
    Peut-on en déduire qu'il n'y a plus de problème de concurrence ?
  3. Comment doit on faire pour être sûr que chaque thread voit les modifications effectuées sur une variable par l'autre thread ?

Exercice 4 - strtok

On cherche à implanter en Java une méthode strtok offrant un comportant équivalent à son alter-ego de la bibliothèque standard C. La méthode strtok :
  • lorsqu'elle est appelée avec un chaîne de caractère ( CharSequence ) et un délimiteur ( char ), renvoie un CharSequence correspondant à la chaîne du début de la chaîne jusqu'à la prochaine occurrence du délimiteur.
  • lorsqu'elle est appelée avec null et un délimiteur, renvoie un CharSequence de la position lors du dernier appel à la méthode jusqu'à la prochaine occurrence du délimiteur.

Voici le code :
et un exemple :
  1. Rappeler pourquoi la méthode strtok ci-dessous n'est pas thread-safe .
  2. Faire en sorte que la méthode strtok soit thread-safe en utilisant des variables locales à un thread.