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 ==> 5572 jshell> 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, являются их собственными. |