Execution de tâches parallèles [Fermé]

Signaler
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
-
bloomingdals
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
-
Bonsoir,

voila mon probleme: j'ai une classe qui herite de thread que je voudrai l'instancier plusieures fois dans une autres classes. je veux que ces instances s'exécutent en parallèles.
j'ai trouvé sur google un très bon exemple pour ce genre de chose, j'ai testé le code et ca fonctionne, aucun problem. mais quand j'essaie d'écéuter ce même code avec mes taches à moi c'est à dire les instannces dont je vous ait parlé, ca ne marche pas , l'exécution se fait de manière séquentielle et non simultanée. je ne sais pas si le problem vient du fait que le temps d'exécution de chaque instance est trop long ou c'est parce que j'ai une erreur de codage

svp aidez moi

8 réponses

Messages postés
16093
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 décembre 2019
2475
La méthode à redéfinir pour dire quoi faire pendant le thread c'est run(), mais c'est la méthode start() qui permet de créer le parallélisme. Si tu appelles run() tout seul le traitement se fera correctement mais en séquentiel...

Si tes threads s'exécutent en séquentiel c'est donc surement parce que tu appelles la méthode run() au lieu de la méthode start().
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
1
non pas du tout j'appel la methode start pour chacune des instances mais étant donné que le traitement de chaque instances est un peu long on a l'impression que chaque instance monopolise la JVM.
je crois qu'il faut rajouter la methode sleep ou wait dans le code de ma classe à instancier mais je sais pas où exactement je dois la mettre de sorte a donner la chance aux autres instances d'êtres exécutée aussi
Messages postés
16093
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 décembre 2019
2475
Non, il n'y a rien à faire, la JVM se charge toute seule d'ordonancer les threads et de leur donner la main chacun à leur tour. Tu peux éventuellement modifier les priorités de tes threads pour qu'il y en ai un qui soit appelé d'abord s'il est prêt, mais les sleep ne doivent pas servir dans ces cas là.
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
1
rebonjour,
au fait j'ai un aute probleme. je peux exécuter maintenant plusieurs thread de manière parallèles (l'ordre est aléatoire). chacun de ces thread retourne un fichiers qui contient une ligne.
à la suite j'ai une instrunction java qui prend tous ces fichiers et les concatène. le probleme est que je suis obligé de faire un sleep (1500) pour que les fichiers soient prêt pour cette concaténation (sinon je risque de qu'il soit encore vide).
comment réaliser ca sans utiliser sleep (car le timer peut changer je ne peux le postitionner a 1500 ms pour toujours)??? j'ai essayé avec wait/ notify mais le notify ne fonctionne pas mon thread ne se reveille pas!!!
KX
Messages postés
16093
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
11 décembre 2019
2475
Tu devrais utiliser join() pour attendre que les threads se terminent.

Exemple :

Thread[] tab = ...

// Démarrage de tous les threads d'un tableau
for (Thread t : tab)
    t.start();

// Attente de la fin de tous les threads
for (Thread t : tab)
    t.join();
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
1
merci bcp j'essairai avec ca et je t'informerai
Messages postés
74
Date d'inscription
mercredi 20 février 2013
Statut
Membre
Dernière intervention
6 août 2013
1
bonjour au fait j'ai arrangé un peu mon code et j'ai utilisé la methode join () dont tu m'a parlée. je l'ai mise après le thread quil DOIT être fini pour lancer la suite du programme mais ca ne marche toujours pas.
je te met le code il est commenté stp jette un coup d'oeil et dis moi comment je peux régler mon probleme
merci

public class Bgp_Peers extends Thread{
    
static TargetRouter target;
Vector <String> oids;
Vector <String> files;
File targetFile;
String state_s;

  public Bgp_Peers (TargetRouter target) throws IOException, Exception
  { 
    this.target=target;
    this.oids=loadOids();
    this.files=loadFiles();
    this.targetFile=new File("/var/lib/mysql/"+this.target.getDataBase()+"/Bgp_Peers");
    this.start();
  }

    // @Override
    public synchronized void run() 
    {  
      // définir le rep d'exécution des requêtes Shell
      final Shell sh = new Shell();
      File dir= new File("/root/Desktop/Bgp_Peers");
      if (dir.exists()==false)
      {
          dir.mkdir();
      }
      sh.setDirectory(dir);
      String cmd0="cd /root/Desktop/Bgp_Peers";
      try { sh.command(cmd0).consume();} catch (IOException ex) {Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex); } 
     
 // lancer les Threads (voir la class ExcecuteSnmp)
      ExecuteSnmp s=new ExecuteSnmp(this, oids, files, sh);
      s.start();
    try {
        s.join(); // je fais le join
    } catch (InterruptedException ex) {
        Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
    }
    
     ConcatFile c=new ConcatFile(this, sh); // je veux que le thread ConcatFile ne soit lancé que si ExecuteSnmp soit terminé
       c.start();
        
    
    
         
 }

 
    public Vector <String> loadOids()
    {
        Vector oids = new Vector();
        oids.add(".1.3.6.1.2.1.15.3.1.1");
        oids.add(".1.3.6.1.2.1.15.3.1.2");
        oids.add(".1.3.6.1.2.1.15.3.1.3");
        oids.add(".1.3.6.1.2.1.15.3.1.9");
        oids.add(".1.3.6.1.2.1.15.3.1.10");
        oids.add(".1.3.6.1.2.1.15.3.1.11");
 
        return(oids);
    }
   
    public Vector<String> loadFiles()
    {
        Vector files=new Vector();
        files.add("peerAddr");
        files.add("peerState");
        files.add("peerStatus");
        files.add("peerRemoteAS");
        files.add("peerInUpdates");
        files.add("peerOutUpdates");
  
        return(files);
    }
    
  class walk extends Thread // Défini les Thread
  {  String routerIP;
     String community;
     String oid;
     String file;
     Shell sh;
     public walk(Bgp_Peers b, String oid, String file, Shell sh)
     {
         this.routerIP=b.target.getRouterAddr();
         this.community=b.target.getCommunity();
         this.oid=oid;
         this.file=file;
         this.sh=sh;
     }
     public void run()
     {
        String cmd="snmpwalk -Ovq -v2c -c "+target.getCommunity()+" "+target.getRouterAddr()+" "+oid+ "> "+file+ "";try {
        sh.command(cmd).consume(); 
           } catch (IOException ex) {
               Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
           } catch (Exception ex) { 
             Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
     }
     }
  }   
  
  class ExecuteSnmp extends Thread // lance une multitude de thread de la class walk
  {   Bgp_Peers b;
      Shell sh;
      
      public ExecuteSnmp(Bgp_Peers b, Vector<String> oids, Vector<String> files, Shell sh)
      {
          this.b=b;
          this.sh=sh;
      }
      public void run()
      {
        int i;
        for (i=0; i<=5;i++)
        {
            new walk(this.b, oids.elementAt(i), files.elementAt(i), this.sh).start();
        }
      }
      
      
  }
  
  class ConcatFile extends Thread
  {   
      Bgp_Peers b;
      File targetFile;
      Shell sh;
      public ConcatFile(Bgp_Peers b, Shell sh)
      {
          this.b=b;
          this.targetFile=b.targetFile;
          this.sh=sh;
      }
      public void run()
      {
                // concaténer les fichiers
     String cmd1="paste -d ':' 'peerAddr' 'peerState' 'peerStatus' 'peerRemoteAS' 'peerInUpdates' 'peerOutUpdates' > "+targetFile.getPath()+"";
     try {  

              sh.command(cmd1).consume();
              
         } 
     catch (IOException ex) { Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex); } 
      }
  }
    
  public static void main(String[] args) throws IOException, Exception 
  {
      Bgp_Peers b=new Bgp_Peers(new TargetRouter("10.16.1.29", "Divona", "OrangeTunisie"));
     
  }

}