Vous êtes sur la page 1sur 3

T1 Programmation Concurrente 2023/2024 – M1 RSD

Sommaire
Exercice 1 : Nom par défaut de threads et méthode isAlive()........................................................................................................1
Exercice 2 : DestroyJavaVM............................................................................................................................................................2
Exercice 3 : ThreadGroup............................................................................................................................................................... 3
Exercice 1 : Nom par défaut de threads et méthode isAlive()

Soit les deux classes Java suivantes : class BavarderEtLancerLePerroquet4 {


public static void main(String args[]) {
class Perroquet4 extends Thread { Perroquet4 perroquet = new Perroquet4 ("coco",5);
private String cri = null; perroquet.start(); // tourne 5 fois
private int fois = 0; System.out.println("Thread bavard : "
public Perroquet4 (String s, int i) { + Thread.currentThread().getName());
cri = s; for (int n=0; n<15; n++) { // tourne 15 fois
fois = i; try {Thread.sleep(1000);}
} catch(InterruptedException e) { }
public void run() { System.out.print("Thread perroquet isAlive : "+ perroquet.isAlive()+"\t");
System.out.println("Thread perroquet : " blabla();
+ getName()); }
for (int n=0; n<fois; n++) { }
try {Thread.sleep(1000); } private static void blabla() {
catch(InterruptedException e) { } System.out.println("blabla");
System.out.println(cri); }
} }
}
}

Indication : la méthode de classe currentThread() retourne un pointeur sur l’objet Thread qui appelle cette
méthode.
 Lancer l’exécution de la classe BavarderEtLancerLePerroquet4.
 Quel est le nom du thread principal ?
 Quel est le nom qui est donné par défaut à l’autre thread ?
 Quelle est l’utilité de la méthode isAlive() ?

Modifier maintenant la classe BavarderEtLancerLePerroquet4 comme suit :

class BavarderEtLancerLePerroquet4{
public static void main(String args[]) {
Perroquet4 perroquet1 = new Perroquet4 ("rsd",2);
Perroquet4 perroquet2 = new Perroquet4 ("gl",2);
Perroquet4 perroquet3 = new Perroquet4 ("sic",2);
Perroquet4 perroquet4 = new Perroquet4 ("mid",2);
perroquet1.start();
perroquet2.start();
perroquet3.start();
perroquet4.start();
}
}

 Lancer l’exécution de la classe BavarderEtLancerLePerroquet4.


 Quel est le nom qui est donné par défaut à chaque thread ?

1
Exercice 2 : DestroyJavaVM

Soit les deux classes Java suivantes :


class Perroquet5 extends Thread { class BavarderEtLancerLePerroquet5 {
private String cri = null; public static void main(String args[]) {
private int fois = 0; Thread.currentThread().setName("bavard");
public Perroquet5 (String s, int i) { Perroquet5 perroquet = new Perroquet5 ("coco",5);
super ("perroquet"); perroquet.start();
cri = s; for (int n=0; n<10; n++) {
fois = i; try {Thread.sleep(1000); }
} catch(InterruptedException e) { }
public void run(){ blabla();
// avant la boucle }
afficheThreads(); }
for (int n=0; n<fois; n++) { // début boucle for private static void blabla() {
try {Thread.sleep(1000); } System.out.println("blabla");
catch(InterruptedException e) { } }
System.out.println(cri); }
} // fin boucle for
// après la boucle
afficheThreads();
} // fin run

private void afficheThreads() {


Thread [ ] tabThread = new Thread [Thread.activeCount()];
int nbrThread = Thread.enumerate(tabThread);
for (int i = 0; i < nbrThread ; i++)
System.out.println(i + "-ieme Thread : " + tabThread[i].getName());
}
} // fin class

Indication :
La méthode setName (String nom) permet de nommer un Thread.
Le constructeur de Thread offre la possibilité également de le nommer comme suit : Thread (String nom).
La méthode de classe activeCount () donne le nombre de Threads actifs dans le groupe de l'appelant.
La méthode de classe enumerate (Thread[ ] tableau) stocke dans le tableau donné les références des Threads
actifs dans le groupe de l'appelant et ses sous-groupes. Elle renvoie le nombre de Threads actifs obtenus.

Lancer l’exécution de la classe BavarderEtLancerLePerroquet5.


La procédure afficheThreads() est appelée avant et après la boucle for de la méthode run().

Les threads actifs avant la boucle for étaient :


0-ieme Thread : bavard
1-ieme Thread : perroquet

Après la boucle for, c’est toujours :


0-ieme Thread : bavard
1-ieme Thread : perroquet

Maintenant, modifier votre code afin de lancer le main 5 fois (5 blabla) et le perroquet 10 fois (10 coco).

Les threads actifs avant la boucle for étaient :


0-ieme Thread : bavard
1-ieme Thread : perroquet

Après la boucle for, sont devenus :


0-ieme Thread : perroquet
1-ieme Thread : DestroyJavaVM

2
Justifier ce résultat, c’est quoi le DestroyJavaVM ? Pourquoi est-il lancé ?
Exercice 3 : ThreadGroup
Soit la classe java suivante :

class FFF extends Thread {


public FFF (ThreadGroup a, String str){
super (a, str);
}
public void run(){
System.out.println ("BONJOUR, je suis : "+ getName()+ " mon groupe est "+ getThreadGroup().getName());
}
}

Lancer l’exécution de la classe java suivante :

class TestTest {
public static void main (String [] args){
ThreadGroup master = new ThreadGroup ("MASTER");
ThreadGroup rsd = new ThreadGroup (master,"rsd");
FFF t1 = new FFF (rsd, "Etudiant 1");
FFF t2 = new FFF (rsd, "Etudiant 2");
FFF t3 = new FFF (rsd, "Etudiant 3");
ThreadGroup sic = new ThreadGroup (master,"sic");
FFF t4 = new FFF (sic, "Etudiant 4");
FFF t5 = new FFF (sic, "Etudiant 5");
ThreadGroup principal = Thread.currentThread ().getThreadGroup ();
int a = principal.activeGroupCount ();
System.out.println ("Les groupes de threads actifs dans " + principal.getName () +" : " + a);
ThreadGroup[] grpList = new ThreadGroup[a];
int count = principal.enumerate(grpList);
for (int i = 0; i < count; i++)
System.out.println(" -ThreadGroup " + grpList[i].getName() + " trouvé");
System.out.println ("Le père de MASTER est : "+master.getParent().getName());
System.out.println ("Le père de rsd est : "+rsd.getParent().getName());
System.out.println ("Le père de sic est : "+sic.getParent().getName());
System.out.println ("Etudiant 1 appartient à : "+t1.getThreadGroup().getName());
System.out.println ("Etudiant 5 appartient à : "+t5.getThreadGroup().getName());
System.out.println ("Avant start, l'état de Etudiant 1 est : "+ t1.getState());
t1.start();
System.out.println ("Après start, l'état de Etudiant 1 est : "+ t1.getState());
t2.start();
t3.start();
t4.start();
t5.start();
}
}

 Que fait le code précédent ? Lister en particulier les groupes crées et leurs membres. Faites un dessin
complet.

Vous aimerez peut-être aussi