:: Enseignements :: Master :: M1 :: 2007-2008 :: 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 le nombre de threads que l'on veut lancer en concurrence.
         java HelloThread 5
        
    Lance 5 threads en concurrence.

Exercice 2 - Coitus interruptus

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

  1. Expliquer les différences entre les méthodes interrupted et isInterrupted de la classe Thread.
  2. Modifier votre code en utilisant un scanner (java.util.Scanner) pour lire l'entrée standard et interrupt() pour interrompre un thread.
  3. Monitoring de l'activté de la machine virtuelle.
    Lancer votre programme avec la commande :
         java -Dcom.sun.management.jmxremote HelloThread 5
        
    Puis dans un autre shell lancer la commande :
       	 jconsole
        
    et sélectionner HelloThread dans les processus locaux. Vérifier par ce biais que les threads sont bien interrompus.

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

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 chaine du début de la chaine jusqu'à la prochaine occurence 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 occurence 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.