Это следующий вопрос к моему другому вопросу: Запустите 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
Есть идеи, почему мой процесс не завершится? Или у вас есть какие-либо библиотеки, которые предлагают правильно обрабатывать пакетные файлы и ждать, пока выполнение не будет завершено?