English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In Java 9 Bisher unterstützte die Process API noch nicht grundlegende Funktionen für die Verwendung lokaler Prozesse, wie z.B. das Abrufen des Prozess-PIDs und des Eigentümers, des Startzeitpunkts des Prozesses, der verwendeten CPU-Zeit und der Anzahl der laufenden lokalen Prozesse.
Java 9 Zur Erweiterung der java.lang.Process-Klasse wurde eine neue Schnittstelle namens ProcessHandle zu der Process-API hinzugefügt.
Ein Beispiel für das ProcessHandle-Interface kennzeichnet einen lokalen Prozess, der es ermöglicht, den Prozessstatus abzurufen und den Prozess zu verwalten.
Das ProcessHandle-Interface ist als Nested Interface in Info eingebettet, um Entwicklern zu ermöglichen, sich von der Notwendigkeit zu befreien, lokalen Code zu verwenden, um den PID eines lokalen Prozesses zu erhalten.
Wir können keine Methodenimplementierung in einem Interface bereitstellen. Wenn wir eine Kombination aus abstrakten und nicht-abstrakten Methoden (Methoden und Implementierung) bereitstellen möchten, müssen wir eine abstrakte Klasse verwenden.
Der Methode onExit() aus dem ProcessHandle-Interface kann verwendet werden, um bestimmte Aktionen auszulösen, wenn ein Prozess beendet wird.
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: %n", p.pid()); System.out.printf("Command name: %n", info.command().orElse(np)); System.out.printf("Command line: %n", info.commandLine().orElse(np)); System.out.printf("Start time: %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)); } }
Der folgende Beispielaufruf gibt das Ausgaberesultat an:
Prozess-ID : 5800 Befehlsname : C:\Windows\System32\notepad.exe Befehlszeile : Nicht Vorhanden Startzeit: 2017-11-04T21:35:03.626 Argumente : Nicht Vorhanden Benutzer: administrator