Java 9 API de procesos mejorada

Java 9 新特性Nuevas características de Java 9

Antes de Java 9, la API de procesos carecía de soporte básico para procesos locales, como obtener el PID y el propietario de un proceso, la hora de inicio del proceso, cuánto tiempo de CPU ha utilizado el proceso, cuántos procesos locales se están ejecutando, etc.

Java 9 añadió a la API de procesos una interfaz llamada ProcessHandle para mejorar la clase java.lang.Process.

Una instancia de la interfaz ProcessHandle identifica un proceso local y permite consultar el estado del proceso y gestionarlo.

La interfaz anidada Info de ProcessHandle permite a los desarrolladores librarse de la necesidad de usar código nativo con frecuencia para obtener el PID de un proceso local.

No podemos proporcionar implementaciones de métodos en una interfaz. Si queremos proporcionar una combinación de métodos abstractos y no abstractos (métodos con implementación), entonces tenemos que usar una clase abstracta.

El método onExit() declarado en la interfaz ProcessHandle se puede utilizar para activar ciertas acciones cuando un proceso termina.

Ejemplo

import java.time.ZoneId; import java.util.stream.Stream; import java.util.stream.Collectors; import java.io.IOException; public class Tester { public static void main(String[] args) throws IOException { ProcessBuilder pb = new ProcessBuilder("notepad.exe"); String np = "Not Present"; Process p = pb.start(); ProcessHandle.Info info = p.info(); System.out.printf("Process ID : %s%n", p.pid()); System.out.printf("Command name : %s%n", info.command().orElse(np)); System.out.printf("Command line : %s%n", info.commandLine().orElse(np)); System.out.printf("Start time: %s%n", info.startInstant().map(i -> i.atZone(ZoneId.systemDefault()) .toLocalDateTime().toString()).orElse(np)); System.out.printf("Arguments : %s%n", info.arguments().map(a -> Stream.of(a).collect( Collectors.joining(" "))).orElse(np)); System.out.printf("User : %s%n", info.user().orElse(np)); } }

El resultado de la ejecución del ejemplo anterior es:

Process ID : 5800
Command name : C:\Windows\System32\notepad.exe
Command line : Not Present
Start time: 2017-11-04T21:35:03.626
Arguments : Not Present
User: administrator

Java 9 新特性Nuevas características de Java 9

Otras extensiones