Zum Inhalt springen

Multiprocessing und Konsolenausgaben


Znoob

Empfohlene Beiträge

Moin...

...hab folgendes Problem....

Ein Java-Programm, das normal über die UNIX-Eingabeaufforderung gestartet wird, startet immer wieder ein neues Java-Programm.

Das Problem ergibt sich dann, wenn in dem neu gestarteten Programm Konsolenausgaben auftreten, diese Programme sich einfach aufhängen und die Verarbeitung einstellen.

Hat von euch jemand schon ähnliche Erfahrungen gemacht?

Meine Vermutung ist die, da die neuen Java-Programmen ja nicht innerhalb einer neuen Konsole gestartet werden, das Programm nicht weiß, wohin die Ausgaben gesendet werden sollen....

Eine Lösungsmöglichkeit wäre vielleicht, alle Konsolenausgaben in eine Datei um zu leiten, aber wie das funktioniert habe ich noch nicht rausgefunden....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das hab ich schon probiert, aber nicht hinbekommen....

Process pr = Runtime.getRuntime().exec(javahome + "java -classpath " + classPath + " " + klasse);

InputStream is = pr.getInputStream();

System.out.write(is.read());

InputStream es = pr.getErrorStream();

System.out.write(es.read());

Wie muss ich mir das sonst vorstellen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich wurde nicht byte für byte auslesen, sondern mit available testen wieviele Zeichen verfügbar sind und dann mit der read(byte[] array)-Methode mehr auf einmal lesen.

Ansonsten sieht es eigentlich ok aus. Kann mir so eigentlich nicht vorstellen, warum das Programm abstürzen sollte.

<edit>

Liegt es vielleicht daran, dass du sowieso nur 1 Byte ausliest und dann nie wieder aus dem Inputstream liest. Dann gibt du auch nru 1 Byte auf der Konsole aus und danach wie wieder etwas.

</edit>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Problem liegt am Prinzip eines InputStream. Wenn keine Daten mehr vorhanden sind, wir solange geblockt, bis wieder etwas da ist.

Zu deinem Beispiel:


01 Process pr = Runtime.getRuntime().exec(javahome + "java -classpath " + classPath + " " + klasse);

02

03 InputStream is = pr.getInputStream();

04 System.out.write(is.read());

05 InputStream es = pr.getErrorStream();

06 System.out.write(es.read());

Erstmal wird überhaupt nichts passieren, bis du in Zeile 03 aus dem InputStream Daten erhälst. Hiervon gibst du dann ein einziges Byte aus (das erste halt) und danach machst du mit dem InputStream überhaupt nichts mehr. Danach geht dasgleiche mit dem ErrorStream nochmal von vorne los - du wirst also maximal zwei Bytes auf der Console ausgeben können und das wars. Die Lösung für dein Programm sind zwei Threads, die die Daten der Streams auffangen und auf die Console weitergeben: Alles ungetestet, aber sollte eigentlich funktionieren :-) Ciao Christian


public class TestClass {


  public static void main(String[] args) {


    Process pr = Runtime.getRuntime().exec(javahome + "java -classpath " + classPath + " " + klasse);

    InputStream inStream = pr.getInputStream();

    InputStream errorStrean = pr.getErrorStream();


    StreamRelayThread inRelay = new StreamRelayThread(inStream, System.out);

    StreamRelayThread errorRelay = new StreamRelayThread(errorStream, System.err);

    inRelay.start();

    errorRelay.start();


    inRelay.join();

    errorRelay.join();


  }


}


public class StreamRelayThread extends Thread {


  private InputStream myInStream = null;

  private OutputStream myOutStream = null;


  public StreamRelayThread(InputStream inStream, OutputStream outStream) {

    this.myInStream = inStream;

    this.myOutStream = outStream;

  }


  public void run() {

    try {

      for(int data = this.myInStream.read(); data > -1; data = this.myInStream.read()) {

        this.myOutStream.write(data);

      }

    } catch(IOException e) {

      e.printStackTrace();

    }

  }


}

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 Wochen später...

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...