Université de Nice-Sophia Antipolis POLYTECH
ELEC5-TR 2020–2021
Examen de Langage Java
Durée : 0h30
Aucun document autorisé
Mobiles interdits Note 1 : le sujet de l’exercice qui suit est tiré du site de M. S. Perennes (www- sop.inria.fr). Note 2 : la qualité des commentaires, avec notamment la présence d’affirmations significatives, ainsi que les noms donnés aux variables, et la bonne indentation rentreront pour une part importante dans l’appréciation du travail.
I 1. Écrivez une application Java qui, dans sa méthodemain, crée deux threads. Le premier incré- mente de 1 dix millions de fois un compteur (une variable entière) initialisée à 0. Le deuxième thread décrémente de façon concurrente de 1 dix millions de fois cemêmecompteur.
Une fois l’exécution des deux threads achevée, vous afficherez la valeur du compteur qui nor- malement doit être égale à 0.
/* * @ a u t h o r : V . G r a n e t ( V i n c e n t . G r a n e t @ u n i v - c o t e d a z u r . fr ) */
p u b l i c c l a s s C o m p t e u r { //ressource critique
p r i v a t e i n t cpt = 0;
//Rôle : incrémente le compteur de 1.
p u b l i c s y n c h r o n i z e d v o i d i n c r () { t h i s. cpt ++; } //Rôle : décrémente le compteur de 1
p u b l i c s y n c h r o n i z e d v o i d d é c r () { t h i s. cpt - -; } //
p u b l i c S t r i n g t o S t r i n g () {r e t u r n S t r i n g . v a l u e O f (t h i s. cpt );}
//
p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) { i n t max = 1 0 0 0 0 0 0 0 ; //dix millions
C o m p t e u r cpt = new C o m p t e u r ();
//créer les 2 threads d’incrémentation et de décrémentation
T h r e a d i n c r = new T h r e a d (() - > {f o r (i n t i =0; i < max ; i ++) cpt . i n c r ( ) ; } ) ; T h r e a d d é c r = new T h r e a d (() - > {f o r (i n t i =0; i < max ; i ++) cpt . d é c r ( ) ; } ) ; //démarrer les threads
i n c r . s t a r t (); d é c r . s t a r t ();
//attendre la fin des threads t r y {
i n c r . j o i n ();
d é c r . j o i n ();
}
c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) { S y s t e m . e x i t ( 1 ) ; } //afficher le compteur => 0
S y s t e m . out . p r i n t l n ( cpt );
} }
. . . .
1