Attendre plusieurs threads

parousky Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour, dans une méthode main, je créé plusieurs threads, et je dois lancer une méthode qui est propre à chaque thread créé (car ils ne sont pas tous du même type). Donc je voulais utiliser des join(), mais je ne peux pas dans une méthode static. Alors voilà ce que j'ai écris :

public static void main(String[] args)
{
 new Thread() {
      public void run() {
       
          new Serveur1();
          
          try {
     Serveur1.main(null);
     
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
          
          
      }
  }.start();
  
  
  
  
  
  new Thread()  {
      public void run() {
       
          new Serveur2();
          
          
          try {
           
     Serveur2.main(null);
     
     
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
          
          
      }
  }.start();
}


Donc je ne sais pas trop comment mettre ces join()...
Pourriez-vous m'aider ?
Merci d'avance !

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Au risque de me répéter, créer un objet
new Serveur1();
sans rien faire avec ne sert à rien, ton code est dans une méthode static donc l'appel
Serveur1.main(null)
suffit.

Sinon, puisque join est une méthode de la classe Thread (comme start), c'est sur ces objets qu'il faut l'appliquer. Peu importe que l'appel dans le run soit static ou non.

public static void main(String[] args) {

    // Initialisation des threads

    Thread thread1 = new Thread() {
        public void run() {
            try {
                Serveur1.main(null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

    Thread thread2 = new Thread() {
        public void run() {
            try {
                Serveur2.main(null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

    // Démarrage des threads

    thread1.start();
    thread2.start();
  
    // Attente de la fin des threads

    thread1.join();
    thread2.join();
}
0
parousky Messages postés 325 Date d'inscription   Statut Membre Dernière intervention   6
 
Merci pour le code ! Effectivement, les threads s'attendent mutuellement, mais ils s'attendent trop, le code ne se poursuit pas après ! Voilà ce que j'ai écris :

    // ***** Nantes *****
     Thread Nte = new Thread() {
        public void run() {
         
            
            
            Nantes.Init();
            
            
        }
    };
    Nte.start();
    
    // ***** Cavaillon *****
    Thread Cvn = new Thread() {
        public void run() {
        
            Cavaillon.Init();
          
        }
    };
    Cvn.start();
    
    
    Nte.join();
    Cvn.join();
  
    System.out.println("Après join() pour les aéroports");

Mais le texte n'apparaît jamais ! Même après plusieurs heures !
Vois-tu un problème ?
Merci d'avance !
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Si ça ne se termine jamais c'est que les deux threads se bloquent l'un l'autre : A attends B, et B attends A, donc aucun des deux ne peux se terminer.

Il faudrait voir le code complet pour savoir ce qui se passe, et éventuellement faire un thread dump.

Pour faire un thread dump (au moment où le programme tourne en rond), tu ouvres une invite de commandes et tu tapes
jps

Ça va te sortir la liste des processus Java qui tournent sur ta machine. Il faut identifier le processus qui t'intéresse (grâce à son nom), puis avec le numéro correspondant tu fais
jstack 1234 > stack.txt
et tu regardes le contenu du fichier stack.txt qui t'indiqueras où sont bloqués les threads.
0