Я экспериментировал с Process
и ProcessBuilder
и пришел с этим SSCCE.
import java.io.IOException;
public class TestProcess {
public static void main(String[] args) {
Process process = null;
ProcessBuilder pb = new ProcessBuilder("notepad.exe");
try {
process = pb.start();
} catch (IOException e) {e.printStackTrace();}
//have some time to close notepad
try {
Thread.sleep(10*1000);
} catch (InterruptedException ignored) {}
try {
System.out.println(process.exitValue());
} catch (IllegalThreadStateException e) {
System.out.println(e);
}
if (process != null)
process.destroy();
/*try {
Thread.sleep(0, 1);
} catch (InterruptedException ignored) {}*/
System.out.println(process.exitValue());
}
}
- Если я запущу этот код и закрою блокнот до истечения 10-секундного тайм-аута.
destroy()
вызов не показывает никаких проблем при попытке остановить уже завершенный процесс. Почему? - Если запустить этот код и вообще не закрывать блокнот (с прокомментированным вторым сном)
Кажется, что уничтожение - это асинхронный вызов (просто посылка сигнала?), который приводит к исключению во второй exitValue()
java.lang.IllegalThreadStateException: process has not exited
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)
at TestProcess.main(TestProcess.java:30)
- Если я запускаю этот код и вообще не закрываю блокнот (с незакомментированным вторым сном), то второй
exitValue
никогда не выдает исключение, даже если значение сна составляет всего 1 мс. Это из-заsleep()
накладных расходов? ВторойexitValue
вернет 1.
PS. Я запускаю его из Windows 7 и Eclipse.
} catch (IOException ignored) {}
Извлеките свои ошибки из песка и вместо этого} catch (IOException e) { e.printStackTrace(); }
2) Убедитесь, что код реализует рекомендации, когда Runtime.exec() не будет 3) Чтобы быть точным, SSCCE требует импорта. - person Andrew Thompson   schedule 20.12.2012