Java 9 Verbesserte Process-API

Java 9 新特性Neue Funktionen in Java 9

Vor Java 9 fehlte der Process API noch grundlegende Unterstützung für die Verwendung nativer Prozesse, wie z. B. das Abrufen der PID und des Besitzers eines Prozesses, der Startzeit des Prozesses, wie viel CPU-Zeit der Prozess verwendet hat, wie viele native Prozesse ausgeführt werden usw.

Java 9 fügte der Process API eine Schnittstelle namens ProcessHandle hinzu, um die Klasse java.lang.Process zu erweitern.

Eine Instanz der Schnittstelle ProcessHandle identifiziert einen nativen Prozess und ermöglicht das Abfragen des Prozessstatus und die Verwaltung des Prozesses.

Die verschachtelte Schnittstelle Info von ProcessHandle hilft Entwicklern, dem Dilemma zu entgehen, nativen Code verwenden zu müssen, um die PID eines lokalen Prozesses zu ermitteln.

Wir können keine Methodenimplementierungen in Schnittstellen bereitstellen. Wenn wir eine Kombination aus abstrakten und nicht abstrakten Methoden (Methoden mit Implementierungen) bereitstellen möchten, dann müssen wir abstrakte Klassen verwenden.

Die in der Schnittstelle ProcessHandle deklarierte Methode onExit() kann verwendet werden, um bestimmte Aktionen auszulösen, wenn ein Prozess beendet wird.

Beispiel

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 = "Nicht vorhanden"; Process p = pb.start(); ProcessHandle.Info info = p.info(); System.out.printf("Prozess-ID : %s%n", p.pid()); System.out.printf("Befehlsname : %s%n", info.command().orElse(np)); System.out.printf("Befehlszeile : %s%n", info.commandLine().orElse(np)); System.out.printf("Startzeit: %s%n", info.startInstant().map(i -> i.atZone(ZoneId.systemDefault()) .toLocalDateTime().toString()).orElse(np)); System.out.printf("Argumente: %s%n", info.arguments().map(a -> Stream.of(a).collect( Collectors.joining(" "))).orElse(np)); System.out.printf("Benutzer: %s%n", info.user().orElse(np)); } }

Die Ausgabe des obigen Beispiels ist:

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 新特性Neue Funktionen in Java 9

Andere Erweiterungen