[ JAVA ] - Multithreading guru demandé !!

- Multithreading guru demandé !! [ JAVA ] - Programmation

Marsh Posté le 10-02-2002 à 14:15:30    

Bon j'essaye un peu de comprendre les subtilités du multithreading, mais voici un exemple que je n'ai pas compris:
 
class NouveauThread implements Runnable {
 String nom;
 Thread t;
 
 NouveauThread(String nomthread) {
  nom = nomthread;
  t = new Thread(this,nom);
  System.out.println("Nouveau Thread : " + t);
  t.start();
 }
 
 public void run() {
  try {
   for(int i=5;i>0;i--) {
    System.out.println(nom + " : " + i);
    Thread.sleep(1000);
   }
  } catch (InterruptedException e) {
   System.out.println(nom + " interrompu." );
   }
  System.out.println(nom + " quitté." );
 }
}
 
class DemoJoin {
 
 public static void main(String args[]) {
 
  NouveauThread ob1 = new NouveauThread("Un" );
  NouveauThread ob2 = new NouveauThread("Deux" );
  NouveauThread ob3 = new NouveauThread("Trois" );
 
  System.out.println("Le thread Un est actif : " + ob1.t.isAlive());
  System.out.println("Le thread Deux est actif : " + ob2.t.isAlive());
  System.out.println("Le thread Trois est actif : " + ob3.t.isAlive());
 
  try {
   System.out.println("Fin des threads attendue." );
   ob1.t.join();
   ob2.t.join();
   ob3.t.join();
  } catch (InterruptedException e) {  
   System.out.println("Thread principal interrompu" );
   }
 
  System.out.println("Le thread Un est actif : " + ob1.t.isAlive());
  System.out.println("Le thread Deux est actif : " + ob2.t.isAlive());
  System.out.println("Le thread Trois est actif : " + ob3.t.isAlive());
 
  System.out.println("Sortie du thread principal." );
 }
}

 
et en sortie j'ai ça
http://www.multimania.com/taco2/java.gif
 
Le premier truc que je comprends pas, c'est pourquoi le message "Fin des threads attendue" apparait aussi tôt ! Je pensais que les start() faisaient démarrer les threads tout de suite !! Quel signal attendent ils pour démarrer ?
 
D'autre part j'ai pas très bien compris le fonctionnement de join(), si quelqu'un pouvait me l'expliquer clairement svp merci !!

Reply

Marsh Posté le 10-02-2002 à 14:15:30   

Reply

Marsh Posté le 10-02-2002 à 14:27:45    

NouveauThread ob1 = new NouveauThread("Un" );
  NouveauThread ob2 = new NouveauThread("Deux" );
  NouveauThread ob3 = new NouveauThread("Trois" );
 
apres ca, tu as 4 threads qui tournent : le thread principal et ob1, 2, et 3.
 
le thread principal continue sont execution et affiche donc le Fin des threads tout de suite apres.
 
 
Je pensais que les start() faisaient démarrer les threads tout de suite !!  
 
oui, mais le thread principal continue.
 
D'autre part j'ai pas très bien compris le fonctionnement de join(), si quelqu'un pouvait me l'expliquer clairement svp merci !!  
 
 
monthread.join() bloque l'execution du thread en cours jusqu'a ce que monthread termine son execution. Si monthread est mort, join() renvoie tout de suite.

Reply

Marsh Posté le 10-02-2002 à 16:15:40    

Ah ! Mais, c'est facile de trouver un guru : en plus tu connais parfaitement la méthode ! Tu as oublié ? Alors je te montre : http://forum.hardware.fr/recherche.gif

 

[jfdsdjhfuetppo]--Message édité par Cherrytree--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 10-02-2002 à 16:31:57    

fyi,
 
join() permet à l'objet d'attendre la fin du thread spécifé.
 
En gros dans un thread tu étends l'interface Runnable et tu as la méthode
 
public void run()  
 
Un thread meurt lorsqu'il arrive à la fin de cette méthode run. Si tu veux que les processus s'attendent mutuellement (par exemple ton objet toto doit attendre la fin de ce que le thread t fait, il devra faire:
 
toto.join(t);
//ici t est mort et donc toto peur récupérer le résultat produit par t

Reply

Marsh Posté le 10-02-2002 à 18:09:36    

Tu es trop bon darklord22 :jap:

Reply

Marsh Posté le 10-02-2002 à 18:43:37    

Cherrytree a écrit a écrit :

Tu es trop bon darklord22 :jap:  




 
Tu parles ! Déjà que j'ai fait une erreur de syntaxe dans mon post précédent. En fait il faut appliquer la méthode join au thread à vouloir rejoindre. Donc si dans l'objet toto, tu dois attendre le résultat d'un thread t tu dois faire
 
t.join(); // où t est un thread
 
tu peux ajouter un param au join pour spécifier la durée d'attente maximale (en msec).


---------------
What is popular is not always right, what is right is not always popular :D
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed