2010-07-25 3 views
0

Je tente d'implémenter un scénario utilisant des threads pour exécuter des commandes simultanées sur un serveur. Les commandes envoient juste des demandes à un service fonctionnant sur le serveur et, en retour, obtiennent la sortie requise.Question de thread Java

Les commandes sont générées en fonction de la lecture d'un fichier dont le chemin est donné par l'utilisateur en entrée de l'application. Sur chaque ligne du fichier mentionné ci-dessus, une commande est générée et exécutée sur le serveur. Im en cours d'exécution de ces commandes en appelant une instance du processus bash sur la boîte Linux. Une brève pseudo implémentation de ce qui précède est la suivante.

Class A { 
public static void main(blah blah) 
//take all user inputs, one of which is the location of the file that is to be read. 
try { 
      Runnable runnable =new bckwork(//pass the inputs taken from the user//); 
      thread = new Thread(runnable); 
      thread.start(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

et la classe qui fait le travail réel -

public class bckwork implements Runnable { 

bckwork(//takes in all input that the other class passes on) { 
     //assigns to local variables 
    } 
public void run() { 
     // TODO Auto-generated method stub 
    try{ 
     Process proc = null; 
     proc = Runtime.getRuntime().exec("/bin/bash", null, dir); 
     if (proc != null) { 
      String cmd=""; 
      BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); 

      PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true); 

      BufferedReader br = new BufferedReader(blah blah blah);//reads every line in the file that was passed onto this class. 
       String strLine; 
      while ((strLine = br.readLine()) != null) { 
       cmd=blah+blah+blah//the command is generated,whatever is read off the file is a part of the command. 
       out.println(cmd); 
      String line; 
       while ((line = in.readLine()).length()>1) { 
        line = in.readLine(); 
        System.out.println(line); 
        proc.waitFor(); 
        in.close(); 
        out.close(); 
        proc.destroy(); 
         } 
     } 
} 
}catch(Exception e){} 
} 
} 

Le problème avec les morceaux de code ci-dessus est qu'ils ne fonctionnent que pour la première ligne dans le fichier qui est en cours de lecture, puis les exécutions vont dans une sorte d'impasse. Im devinant que la ligne suivante du fichier n'est jamais lue. Mon intention était de lancer un fil pour chaque ligne qui était en cours de lecture ou essentiellement chaque commande qui était en cours de construction.

Tout pointeur sur la façon dont ce bug peut être corrigé serait grandement apprécié.

Répondre

1

En

while ((line = in.readLine()).length()>1) 

attend in.readLine pour entrer et gèle l'application.