Руководство по Java 9. Улучшения в Process API.

В данной статье мы рассмотрим улучшения, касающиеся Process API, которые были внесены в Java 9.

Мы затронем:

  • данные о текущем процессе
  • перечисление активных процессов

Данные о текущем процессе

Используя класс Process API мы имеем возможность:

  • запустить процесс
  • получить данные процесса (ID, имя и т.д.)
  • и т.д.

Рассмотрим простой пример:


package net.proselyte.java9.processes;

import java.io.IOException;
import java.time.ZoneId;

public class ProcessDemo {
    public static void main(String[] args) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder("nano");
        Process process = processBuilder.start();
        ProcessHandle.Info processInfo = process.info();

        System.out.println("Process information:");
        System.out.println("ID: " + process.pid());
        System.out.println("Name: " + processInfo.command());
        System.out.println("User: " + processInfo.user());
        System.out.println("Start time: " + processInfo.startInstant()
                .map(i -> i.atZone(ZoneId.systemDefault()).toLocalDate()));
        System.out.println("CPU Duration: " + processInfo.totalCpuDuration());

    }
}

В результате выполнения данное команды мы получим, примерно, следующий результат:


Process information:
ID: 27940
Name: Optional[/bin/nano]
User: Optional[proselyte]
Start time: Optional[2018-06-25]
Optional[PT0.02S]

Process finished with exit code 0

Данные об активных процессах

Мы также имеем возможность получать данные об актинвхы процессах.

Рассмотрим простой пример:


package net.proselyte.java9.processes;

import java.util.stream.Stream;

public class LiveProcessesDemo {
    public static void main(String[] args) {
        Stream liveProcesses = ProcessHandle.allProcesses();
        liveProcesses.filter(ProcessHandle::isAlive)
                .forEach(ph -> {
                    System.out.println("ID" + ph.pid());
                    System.out.println("Info: " + ph.info().command());
                    System.out.println("\n======================\n");
                });
    }
}

В результате выполнения данной программы, мы получим, примерно, следующий результат:


...

======================

ID31857
Info: Optional[/usr/bin/nautilus]

======================

ID32041
Info: Optional[/home/proselyte/Programming/Soft/IDEA18/jre64/bin/java]

======================

ID32150
Info: Optional[/opt/google/chrome/chrome]

======================

...

На этом мы заканчиваем обзор нововведений Java 9, касающихся Process API.
В следующей статье мы рассмотрим улучшения, касащиеся класса CompletableFuture.