Я использую ProcessBuilder для запуска внешнего процесса, но мне нужно уметь его убивать. Прямо сейчас у меня нет проблем с убийством процесса, но по какой-то причине поток ошибок не закрывается, поэтому поток, читающий поток, никогда не заканчивается. Это мешает мне закрыть мою программу.Java Stop Process and Close Streams
Здесь я начинаю чтение потоков из потоков ввода и ошибок.
final Thread inputPrinter = new Thread() {
public void run() {
BufferedReader inputStream = new BufferedReader(new InputStreamReader(builder.getInputStream()));
String line;
try {
while ((line = inputStream.readLine()) != null) {
Util.println(line, false);
}
} catch (IOException e) {
} finally {
Util.println("input end");
try {
inputStream.close();
} catch (IOException e) {
}
}
}
};
inputPrinter.start();
Thread errorPrinter = new Thread() {
public void run() {
BufferedReader errorStream = new BufferedReader(new InputStreamReader(builder.getErrorStream()));
String line;
try {
while ((line = errorStream.readLine()) != null) {
Util.println(line, true);
}
} catch (IOException e) {
} finally {
Util.println("error end");
try {
errorStream.close();
} catch (IOException e) {
}
}
}
};
errorPrinter.start();
builder.waitFor();
Util.println("");
Util.println("Finished building project.");
Вот мой код для остановки процесса.
try {
builder.getOutputStream().close();
builder.getInputStream().close();
builder.getErrorStream().close();
} catch (IOException e) {
e.printStackTrace();
}
builder.destroy();
Util.println("");
Util.println("Build aborted by user.", true);
Когда я пытаюсь остановить процесс, я получаю следующее распечатаны.
Построение прерывается пользователем.
Готовый проект.
входной конец
Я никогда не «конец» ошибки и отладки программы показывает поток просто сидит на «ReadLine()».
Код, ожидающий выполнения процесса, запущен в его собственном потоке (отдельно от кода, который убивает процесс).
Что мне нужно сделать, чтобы убедиться, что поток errorPrinter затухает?
Что произойдет, если вы не закрываете потоки перед вызовом destroy? – assylias
Что у всех пустых блоков catch? Вы знаете, что это не просто плохой код, это абсолютно ** опасный код. –
Если я не звоню близко к потокам раньше, то происходит то же самое. Почему пустые блоки блокировки опасны, если мне все равно, если он просто остановится? – EmbMicro