Запустите bat файл на Java и подождите 2

Это дополнительный вопрос к моему другому вопросу:Запустите bat файл на Java и подождите

Причина, по которой я публикую это как отдельный вопрос, заключается в том, что на тот вопрос, который я уже задавал, ответили правильно. Из некоторых исследований я сделал мою проблему уникальной для моего случая, поэтому я решил создать новый вопрос. Пожалуйста, прочитайте этот вопрос, прежде чем продолжить с этим, поскольку они тесно связаны.

Выполнение предложенного кода блокирует программу при вызове waitFor. После некоторых исследований я обнаружил, что метод waitFor блокирует, если у вашего процесса есть выходные данные, которые необходимо обработать, поэтому сначала нужно очистить поток вывода и поток ошибок. Я делал эти вещи, но мой метод все еще блокирует. Затем я обнаружил предложение просто зацикливаться, ожидая, когда метод exitValue вернет выходное значение процесса и обработает выброшенное исключение, если это не так, делая паузу на короткое время, а также чтобы не использовать весь процессор. Я сделал это:

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

но мой процесс не закончится! Я продолжаю получать эту ошибку:

java.lang.IllegalThreadStateException: process has not exited

Любые идеи относительно того, почему мой процесс не выйдет? Или у вас есть какие-либо библиотеки, которые предлагают правильно обрабатывать пакетные файлы и ждать, пока выполнение не будет завершено?

Ответы на вопрос(1)

Ваш ответ на вопрос