Multi-Thread und CMD-Commands

Crash123

Erfahrenes Mitglied
Hi an alle,

kann mir vielleicht jemand bei folgendem Problem helfen?

Ich habe also eine Klasse die von Thread erbt
in etwa so:
Code:
public class WriterThread extends Thread {
   public WriterThread(String readerName) {
     super();
   }

   @Override
   public void run() {
     super.run();
     process(programmpath);
     }

private Vector<String> process(String cmd) throws Exception {
     Vector<String> lines = new Vector<String>();
     
     Runtime rt = Runtime.getRuntime();
     
     Process pr = rt.exec(cmd);
     
     BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
     
     String line = null;
     
     while((line=input.readLine()) != null){
       lines.add(line+System.lineSeparator());
     }
     
     int exitVal = pr.waitFor();
     if(exitVal != 0){
       lines.add("FAIL"+System.lineSeparator());
       String exception = "";
       for(String exLine : lines){
         exception += exLine+System.lineSeparator();
       }
       
       throw new Exception(exception);
     }

     return lines;
   }
}

Als nächstes möchte ich eine liste von WriterThreads gleichzeitig starten.
Code:
. . .
for(WriterThread wt : writers){               
                 wt.start();
             }
. . .

Das Problem ist nun, dass meist nur ein Thread richtig läuft (oder keiner)
die anderen mir folgenden Fehler ausgeben:
Code:
returns 0x00000057 (Falscher Parameter.)
Ich habe das Programm, dass gestartet wird hard im code für jeden Thread kopiert,
also greift jeder thread auf ein eigenes Programm zu.

Was ist der Fehler?
 
Hi, ganz ehrlich... ich verstehe deinen Code nicht...
Die in zeile 10 verwendete Variable wird nie definiert....
Der im Konstruktur angegebene Formalparamter wird nicht genutzt....
Die zurueckgegeben Lienen in der Methode process Nutzt du überhaupt (Ok das kann ja mal vorkommen...)
Bitte überarbeite deinen Post nochmal...
Ich hab mal eine Lib geschrieben und auf Github gestellt die dir vielleicht hier helfen kann....

https://github.com/fasibio/JavaDistributor
 
Hi und danke für deine Antwort,
Ich habe den Code vereinfacht, natürlich passiert da noch sehr viel mehr und glaube mir im echten Code werden alle variablen genutzt. Ich wollte nur das eigentliche Problem extrahieren statt den gesamten code zu Posten der viele andere Probleme behandelt.
 
Ich habe jetzt den CMD-Aufruf verändert, damit kommt der Fehler nur noch selten :/

Code:
"START /b cmd /c "+programmpath
 
Also ich habe das mal nachgestellt....
Bei mir kam jedoch kein Fehler...

Java:
package multithreadundcmdcommands402780;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Vector;

public class WriterThread extends Thread {
   String programmpath = "calc";
    public WriterThread(String readerName) {
    super();
    }
   
    @Override
    public void run() {
    super.run();
    try {
       process(programmpath);
     } catch (Exception e) {
       e.printStackTrace();
     }
    }
   
   private Vector<String> process(String cmd) throws Exception {
    Vector<String> lines = new Vector<String>();
     
    Runtime rt = Runtime.getRuntime();
     
    Process pr = rt.exec(cmd);
     
    BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
     
    String line = null;
     
    while((line=input.readLine()) != null){
    lines.add(line+System.lineSeparator());
    }
     
    int exitVal = pr.waitFor();
    if(exitVal != 0){
    lines.add("FAIL"+System.lineSeparator());
    String exception = "";
    for(String exLine : lines){
    exception += exLine+System.lineSeparator();
    }
     
    throw new Exception(exception);
    }
   
    return lines;
    }
   
   public static void main(String[] args) {
     WriterThread t[] = new WriterThread[10];
     for (WriterThread one : t){
       one = new WriterThread("");
       one.start();   
     }
     
   }
   }
 
ich nehme an, weil "calc" recht schnell aufgerufen wird und sich die Threads
daher nicht überschneiden, oder so.
Das Programm das ich aufrufe ist die GPShell.exe
 
Wenn das Programm nicht damit klarkommt das es mehr als einmal zur gleichen zeit aufgerufen wird, kannst du in deiner Thread-Klasse die kritische Methode process mit synchronized vor gleichzeitiger Ausführung in unterschiedlichen Threads schützen
Java:
private synchronized Vector<String> process(String cmd) throws Exception{....}

Dies geht natürlich aber auf die Geschwindigkeit.... Da Thread evtl. aufeinander warten müssen
Das kannst du auch auf das Object und nicht nur auf die methode beziehen...
synchronized(rt){
rt.exec(...);
} <-- das runtime object
 
Zuletzt bearbeitet:
Dass die Threads auf einander warten, ist nicht zielführend,
da es durchaus gewünscht ist über haupt das Ziel ist, dass
sie gleichzeitig laufen und das programm gleichzeitig starten.

Wie oben schon gesagt wird das programm ja eh kopiert für
jeden thread, so kann es ja eigentlich nicht sein, dass es
doppelte Zugriffe darauf gibt.
 
bzgl.:
ja eh kopiert für
jeden thread, so kann es ja eigentlich nicht sein, dass es
doppelte Zugriffe darauf gibt.

---> Naja das kommt auf das Programm an...
Wenn das Programm auf gleiche Programmdateien zugreift kann hier schon eine Blockade sein...
Somit liegt es weniger an deinem Java Code als mehr am Programm selber bzw. dessen aufruf....
Somit würde ich sagen das Thema ist hier im falschen Forum.
Bzw. du suchst die Lösung an der falschen stelle....
Hab es nochmal mit exel propiert.
Auch hier starten die Programme ohne probleme...
Somit kann es nur an der exe bzw dessen cmd aufruf liegen
 

Neue Beiträge

Zurück