verrouiller un objet crée par un thread

verrouiller un objet crée par un thread - Java - Programmation

Marsh Posté le 15-04-2013 à 12:14:38    

Bonjour tout le monde,
j'ai une suite de thread indépendant qui s'exécutent au même temps chacun d'entre eux crée un fichier qui lui est propre. a la suite de ces thread, j'ai une instrunction java qui prend tous ces fichiers et concatène leurs contenu. le problème est que si je ne fais pas moi même un sleep de 1minute 30 la concaténation accéde à ces fichiers alors qu'il ne sont pas encore finalisé. je sais pas comment mettre un verrou sur ces fichiers sachant que mes thread sont déclarés de manière anonyme (new thread() { blablabla }
 
voici mon code si vous pourriez m'aider ca sera gentil
 
public Bgp_Peers() throws IOException, Exception
  {  
    this.start();
  }
 
    // @Override
    public void run()  
    {  
      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); }  
       
      final Vector <String> oids=loadOids();
      final Vector <String> files=loadFiles();
       
      File targetFile=new File("/var/lib/mysql/OrangeTunisie/Bgp_Peers" );
       
      // exécutions des requêtes SNMPwalk en parallèle : voila mes thread parallèles
 
       new Thread(){public void run(){String cmd="snmpwalk -Ovq -v2c -c INTERNET@orange 10.53.3.150 "+oids.elementAt(0)+ "> "+files.elementAt(0)+ "";try {
               sh.command(cmd).consume();
           } catch (IOException ex) {
               Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
           }
}}.start();
       new Thread(){public void run(){String cmd="snmpwalk -Ovq -v2c -c INTERNET@orange 10.53.3.150 "+oids.elementAt(1)+ "> "+files.elementAt(1)+ "";try {
               sh.command(cmd).consume();
           } catch (IOException ex) {
               Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
           }
}}.start();
       new Thread(){public void run(){String cmd="snmpwalk -Ovq -v2c -c INTERNET@orange 10.53.3.150 "+oids.elementAt(2)+ "> "+files.elementAt(2)+ "";try {
               sh.command(cmd).consume();
           } catch (IOException ex) {
               Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
           }
}}.start();
       new Thread(){public void run(){String cmd="snmpwalk -Ovq -v2c -c INTERNET@orange 10.53.3.150 "+oids.elementAt(3)+ "> "+files.elementAt(3)+ "";try {
               sh.command(cmd).consume();
           } catch (IOException ex) {
               Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
           }
}}.start();
       new Thread(){public void run(){String cmd="snmpwalk -Ovq -v2c -c INTERNET@orange 10.53.3.150 "+oids.elementAt(4)+ "> "+files.elementAt(4)+ "";try {
               sh.command(cmd).consume();
           } catch (IOException ex) {
               Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
           }
}}.start();
       new Thread(){public void run(){String cmd="snmpwalk -Ovq -v2c -c INTERNET@orange 10.53.3.150 "+oids.elementAt(5)+ "> "+files.elementAt(5)+ "";try {
               sh.command(cmd).consume();
           } catch (IOException ex) {
               Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
           }
}}.start();
       
       // attendre que les fichiers crées soient prêts
      try {
          this.sleep(1500);
      } catch (InterruptedException ex) {
          Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex);
      }
       
      // concaténer les fichiers voila la concaténation que je veux réaliser sans recourir à la methode sleep
       String cmd1="paste -d ':' 'peerAddr' 'peerState' 'peerStatus' 'peerRemoteAS' 'peerInUpdates' 'peerOutUpdates' > "+targetFile.getPath()+"";
       System.out.println(cmd1);
       try {
             sh.command(cmd1).consume();
             // MAJ de la table Bgp_Peers
             new UpdateOtherInfos(targetFile, "Bgp_Peers" );
           }  
       catch (IOException ex) {Logger.getLogger(Bgp_Peers.class.getName()).log(Level.SEVERE, null, ex); }
     
    }
 
    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);
    }

Reply

Marsh Posté le 15-04-2013 à 12:14:38   

Reply

Marsh Posté le 16-04-2013 à 10:27:13    

Ton code est vraiment pas beau à voir  :sweat:  
Sinon pour répondre à ta question, il faut que tu gardes une référence sur chacun de tes threads, et que tu appelles la méthode join() dessus pour attendre la fin de leur exécution.
En gros:

Code :
  1. Thread thead1 = new Thread(){public void....
  2. ...
  3. thread1.join();


---------------
Light is right
Reply

Sujets relatifs:

Leave a Replay

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