Статьи

Java 9: ​​Усовершенствования API Процесса

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