:: Enseignements :: Master :: M1 :: 2011-2012 :: Java Avancé ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | 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
...
-
Expliquer sur l'exemple ci-dessus pourquoi le compteur
de hello 0 est beaucoup plus petit que le compteur
de hello 1.
-
À quoi sert l'interface Runnable ?
-
É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)).
-
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.
-
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.
-
Expliquer les différences entre les méthodes interrupted
et isInterrupted de la classe Thread.
-
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.
-
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 :
-
Qu'affiche le code suivant avec la ligne de commande : java Test ?
Expliquer.
-
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 ?
-
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 :
-
Rappeler pourquoi la méthode
strtok
ci-dessous n'est pas
thread-safe
.
-
Faire en sorte que la méthode
strtok
soit
thread-safe
en utilisant des variables locales à un thread.
© Université de Marne-la-Vallée