Я запускаю внешнее приложение из своего приложения Java (8u11). Однако приложение не реагирует на ввод пользовательского интерфейса под Windows XP и Windows 7 со стандартным часовым стеклом/счетчиком.Приложение перестает отвечать при использовании Process.waitFor()
Я сузил эту проблему до того, использую ли я Process.waitFor(). Если я это называю, я вижу проблемы, если я не работаю нормально. Кроме того, приложение отключается, если я закрою приложение Java.
Мой вопрос: почему это так - как можно вызывать waitFor(), возможно, повлиять на внутренние действия дочернего процесса? И как я могу избежать этой проблемы?
Это приложение LinPhone.exe, но я не верю, что проблема специфична для приложения - должен быть какой-то общий способ, с помощью которого он обрабатывает стандартный IO и т. Д., Которым я мешаю, позвонив waitFor().
Мне нужно использовать Process.waitFor(), чтобы я мог отслеживать, когда приложение вышло.
Я упростил проблему для этого SCCEE.
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class LinphoneTest {
public static void main(String[] args) throws IOException,
InterruptedException {
String phoneAppPath = "C:\\Program Files\\Linphone\\bin\\linphone.exe";
ProcessBuilder processBuilder = new ProcessBuilder(phoneAppPath);
// move up from bin/linephone.exe
File workingDir = new File(phoneAppPath).getParentFile()
.getParentFile();
processBuilder.directory(workingDir);
processBuilder.redirectErrorStream();
Process process = processBuilder.start();
final BufferedReader stdout = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line = null;
try {
while (((line = stdout.readLine()) != null)) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
new Thread(() -> {
try {
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "process wait").start();
Thread.sleep(Long.MAX_VALUE);
}
}
Вы хотите сказать, что процесс, который вы» ожидание не отвечает? –
Пожалуйста, взгляните на [Когда RunTime.exec() не будет] (http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html) , И делайте свое ожидание в фоновом потоке. –
Спасибо. Я выполняю ожидание на фоновом потоке, поскольку он в конечном итоге запускается из потока пользовательского интерфейса, я удалил эту деталь из SSCCE. Я добавлю еще раз и посмотрю, смогу ли я воспроизвести проблему. – Adam