Führen Sie die bat-Datei in Java aus und warten Sie 2

Dies ist eine Folgefrage zu meiner anderen Frage:Führen Sie die bat-Datei in Java aus und warten Sie

Der Grund, warum ich dies als separate Frage poste, ist, dass die Frage, die ich bereits gestellt habe, richtig beantwortet wurde. Aufgrund einiger Nachforschungen, die ich angestellt habe, ist mein Problem für meinen Fall einzigartig, daher habe ich beschlossen, eine neue Frage zu erstellen. Bitte lesen Sie diese Frage, bevor Sie mit dieser fortfahren, da sie eng miteinander verbunden sind.

Das Ausführen des vorgeschlagenen Codes blockiert das Programm beim Aufruf von waitFor. Nach einigen Recherchen habe ich festgestellt, dass die waitFor-Methode blockiert, wenn Ihr Prozess eine Ausgabe hat, die verarbeitet werden muss, sodass Sie zuerst den Ausgabestream und den Fehlerstream leeren sollten. Ich habe diese Dinge getan, aber meine Methode blockiert immer noch. Ich fand dann einen Vorschlag, einfach eine Schleife zu erstellen, während ich auf die exitValue-Methode wartete, um den Exit-Wert des Prozesses zurückzugeben und die Ausnahmebedingung zu behandeln, falls dies nicht der Fall ist. Ich tat dies:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

 public static void main(String[] args) {
  try {
   Process p = Runtime.getRuntime().exec(
     "cmd /k start SQLScriptsToRun.bat" + " -UuserName -Ppassword"
       + " projectName");
   final BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
   final BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
   new Thread(new Runnable() {

    @Override
    public void run() {
     try {
      while (input.readLine()!=null) {}
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   }).start();
   new Thread(new Runnable() {

    @Override
    public void run() {
     try {
      while (error.readLine()!=null) {}
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   }).start();
   int i = 0;
   boolean finished = false;
   while (!finished) {
    try { 
     i = p.exitValue();
     finished = true;
    } catch (IllegalThreadStateException e) {
     e.printStackTrace();
     try {
      Thread.sleep(500);
     } catch (InterruptedException e1) {
      e1.printStackTrace();
     }
    }
   }
   System.out.println(i);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

aber mein prozess wird nicht enden! Ich bekomme immer diesen Fehler:

java.lang.IllegalThreadStateException: process has not exited

Irgendwelche Ideen, warum mein Prozess nicht beendet wird? Oder haben Sie Bibliotheken, die vorschlagen, dass Batch-Dateien ordnungsgemäß ausgeführt werden, und warten, bis die Ausführung abgeschlossen ist?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage