Современный API процессов
Инспектирование и управление процессами ОС с помощью ProcessHandle.
Сравнение кода
✕ Java 8
Process p = Runtime.getRuntime()
.exec("ls -la");
int code = p.waitFor();
// no way to get PID
// no easy process info
✓ Java 9+
ProcessHandle ph =
ProcessHandle.current();
long pid = ph.pid();
ph.info().command()
.ifPresent(IO::println);
ph.children().forEach(
c -> IO.println(c.pid()));
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Полная информация
Доступ к PID, команде, аргументам, времени запуска, загрузке CPU.
Дерево процессов
Навигация между родительскими, дочерними и дочерними процессами.
Мониторинг
onExit() возвращает CompletableFuture для асинхронного мониторинга.
Старый подход
Runtime.exec()
Современный подход
ProcessHandle
Начиная с JDK
9
Сложность
Средний
Поддержка JDK
Современный API процессов
Доступно
Широко доступно с JDK 9 (сент. 2017)
Как это работает
ProcessHandle предоставляет PID, информацию о процессе (команда, аргументы, время запуска, загрузка CPU), отношения родитель-потомок и завершение процесса. Больше не нужны недокументированные внутренности Process.
Связанная документация
Доказательство