Java 9 вносит различные улучшения в Process API, используемый для контроля и управления процессами операционной системы.
Получение информации о процессе
Появился новый класс ProcessHandle который предоставляет pid, родительский и потомки процесса, а также информацию о времени запуска и накопленном времени процессора.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
jshell> Process p = new ProcessBuilder("stress", "--cpu", "4", "--timeout", "5").start();p ==> Process[pid=5572, exitValue="not exited"]jshell> p.pid()$2 ==> 5572jshell> p.info().user()$3 ==> Optional[fahd]jshell> p.info().command()$4 ==> Optional[/usr/bin/stress]jshell> p.info().commandLine()$5 ==> Optional[/usr/bin/stress --cpu 4 --timeout 120]jshell> Arrays.toString(p.info().arguments().get())$6 ==> "[--cpu, 4, --timeout, 120]"jshell> p.info().startInstant()$7 ==> Optional[2018-02-25T16:38:56.742Z]jshell> p.info().totalCpuDuration().get().toMillis()$8 ==> 0 |
Странно, что totalCpuDuration всегда возвращает 0 (строка длительности «PT0S»), независимо от того, какую команду я запускаю.
Обратите внимание, что я вызываю команду stress Linux в приведенном выше примере. Это полезный инструмент для наложения определенного типа нагрузки (например, создания нагрузки на процессор) в вашей системе.
Перечисление всех запущенных процессов
Статический ProcessHandle.allProcesses() возвращает поток всех процессов, видимых текущему процессу.
|
1
2
3
4
5
|
ProcessHandle.allProcesses() .map(ProcessHandle::info) .map(ProcessHandle.Info::commandLine) .flatMap(Optional::stream) .forEach(System.out::println) |
Запуск функции при выходе из процесса
Метод Process.onExit можно использовать для планирования функции при завершении процесса. Этот метод возвращает CompletableFuture , который содержит множество методов, которые можно вызывать для планирования функций. Вот пример:
|
1
2
3
|
Process proc = new ProcessBuilder("sleep", "10").start();proc.onExit() .thenAccept(p -> System.out.println("Process " + p.pid() + " exited with " + p.exitValue())); |
В качестве альтернативы, чтобы дождаться завершения процесса, вы можете вызвать Process.onExit().get() .
| Опубликовано на Java Code Geeks с разрешения Фахда Шарифа, партнера нашей программы JCG . См. Оригинальную статью здесь: Java 9: Усовершенствования Process API
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |