Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Multiprocessing und Konsolenausgaben

Empfohlene Antworten

Veröffentlicht

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....

Ich gehe davon aus dass du das anderen Programm mit Runtime.exec() aufgerufen hast.

Dort gibt es die methode getInputStream unt getErrorStream. Diese kannst du in eine Datei leiten oder an out/error der System-Klasse leiten, dann werden Sie auf der Konsole ausgegeben

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?

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>

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();

    }

  }


}

  • 4 Wochen später...

Danke!

Das bringt mich schonmal ne ganze Ecke weiter!

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.