Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Java

Java 9 Process API Verbesserungen: ProcessHandle, Info & asynchrone Events

Überblick

Java 9 erweitert die Process API (java.lang.Process, java.lang.ProcessHandle) massiv. Endlich gibt es plattformunabhängigen Zugriff auf native Prozessinformationen & -steuerung.

Neue Klasse: ProcessHandle

Repräsentiert einen laufenden OS-Prozess (nicht nur Kind-Prozesse der JVM).

Wichtige Methoden

Methode Rückgabe Beschreibung
pid() long Native Prozess-ID (PID).
info() ProcessHandle.Info Metadaten-Objekt (s. unten).
children() Stream<ProcessHandle> Direkte Kind-Prozesse.
descendants() Stream<ProcessHandle> Alle Nachfahren (rekursiv).
parent() Optional<ProcessHandle> Elternprozess (falls ermitteltbar).
isAlive() boolean Prozess läuft noch.
destroy() boolean SIGTERM (graceful).
destroyForcibly() boolean SIGKILL (sofort).
onExit() CompletableFuture<ProcessHandle> Asynchrone Benachrichtigung bei Beendigung.
allProcesses() (static) Stream<ProcessHandle> Snapshot aller sichtbaren Systemprozesse.

ProcessHandle.Info – Metadaten

Methode Rückgabe
command() Optional<String> – Ausführbarer Name
commandLine() Optional<String> – Vollständige Kommandozeile
arguments() Optional<String[]> – Argument-Array
startInstant() Optional<Instant> – Startzeitpunkt
totalCpuDuration() Optional<Duration> – Kumulierte CPU-Zeit
user() Optional<String> – Prozess-User

Code-Beispiel: Prozess starten & Info auslesen

import java.io.IOException;
import java.time.ZoneId;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ProcessDemo {
    public static void main(String[] args) throws IOException {
        ProcessBuilder pb = new ProcessBuilder("notepad.exe"); // Windows
        // ProcessBuilder pb = new ProcessBuilder("gedit"); // Linux
        Process p = pb.start();

        ProcessHandle.Info info = p.toHandle().info();
        String np = "N/A";

        System.out.printf("PID: %d%n", p.pid());
        System.out.printf("Command: %s%n", info.command().orElse(np));
        System.out.printf("Command Line: %s%n", info.commandLine().orElse(np));
        System.out.printf("Start: %s%n", 
            info.startInstant()
                .map(i -> i.atZone(ZoneId.systemDefault()).toLocalDateTime())
                .orElse(np));
        System.out.printf("Args: %s%n",
            info.arguments().map(a -> Stream.of(a).collect(Collectors.joining(" "))).orElse(np));
        System.out.printf("User: %s%n", info.user().orElse(np));

        // Asynchron auf Ende warten
        p.onExit().thenAccept(ph -> 
            System.out.println("Prozess " + ph.pid() + " beendet.")
        ).join(); // warten für Demo
    }
}

Anwendungsfälle

Hinweise

Java

  1. Java Operatoren meistern: Typen, Syntax und praktische Beispiele
  2. Java Kommentare: Typen, Verwendung und Best Practices
  3. Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
  4. Java Strings meistern: Erstellung, Methoden und Best Practices
  5. Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
  6. Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
  7. Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
  8. Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
  9. Java Assertions: Praktischer Leitfaden zur Fehlererkennung und Code-Reliabilität
  10. Java 9 (JDK 9): Wichtigste Features & Vorteile – Modularität, JShell, HTTP/2 & mehr