Окружающая среда
JDK8 на Windows
Steps
- Создайте
Process
экземпляр с ProcessBuilder
и выполняйте некоторые задачи, используя выходные данные процесса.
- Позвоните
waitFor()
, чтобы дождаться завершения этого процесса.
- Используйте jna + cmd, чтобы принудительно завершить процесс. Я делаю это в блоке
finally
, чтобы убедиться, что процесс всегда завершается.
Field f = process.getClass().getDeclaredField("handle");
f.setAccessible(true);
long handleValue = f.getLong(process);
WinNT.HANDLE handle = new WinNT.HANDLE();
handle.setPointer(Pointer.createConstant(handleValue));
Kernel32 kernel = Kernel32.INSTANCE;
int pid = kernel.GetProcessId(handle);
Process killPr = Runtime.getRuntime().exec("cmd /c taskkill /pid " + pid + " /f /t");
killPr.waitFor();
killPr.destroy();
Вопрос
Безопасно ли выполнять вышеуказанные шаги? Смогу ли я убить еще один не связанный процесс на шаге 3? Я отладил и заметил, что handle
значение ProcessImpl
остается действительным даже после завершения процесса. Я обеспокоен тем, что система Windows будет использовать тот же дескриптор, когда реальный процесс будет завершен, но объект процесса не будет переработан jvm.