Attendre plusieurs threads

Fermé
parousky Messages postés 325 Date d'inscription mardi 11 septembre 2012 Statut Membre Dernière intervention 20 février 2022 - Modifié par KX le 23/01/2015 à 19:37
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 1 févr. 2015 à 13:42
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 janv. 2015 à 19:44
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 mardi 11 septembre 2012 Statut Membre Dernière intervention 20 février 2022 6
Modifié par KX le 1/02/2015 à 13:32
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
1 févr. 2015 à 13:42
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